0

有一段字符串我想用DataContractJsonSerializer. JSON 字符串中有一个成员有时可能是对象,有时可能是字符串。像这样:

{ a: 1, b: 2, c: "c" }

或者

{ a: 1, b: 2, c: {c1: 3, c2: 4} }

我知道第二种情况下对象的结构(我们称之为类Inner),但是如何DataContractJsonSerializer转换两种可能类型的对象呢?

我尝试制作一个显式和隐式转换运算符来转换 from stringto Inner,但它没有受到打击。一个InvalidCastException不断被抛出。

4

1 回答 1

0

我遇到过类似的情况,API 要么返回一个对象数组,要么只返回一个不在数组中的对象(如果只有一个结果)。我完全无法让 DataContractJsonSerializer 做到这一点。我最终不得不切换到 JSON.NET 库并稍微摆弄一下 JsonConverters 以使其正常工作。

在您的 DataContract 中,将“c”声明为 Inner 类型。

[DataMember(Name = "c")]
public Inner C { get; set; }

然后编写一个 JsonConverter 来检查令牌类型,并在反序列化器尝试反序列化 Inner 时做正确的事情。

internal class StringOrInnerConverter : JsonConverter {
    public override bool CanConvert(Type objectType) {
        return objectType == typeof(Inner);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        var ser = new JsonSerializer();

        if (reader.TokenType == JsonToken.StartObject) {
            var inn = ser.Deserialize<Inner>(reader);
            return inn;
        } else if (reader.TokenType == JsonToken.String) {
            var str = ser.Deserialize<string>(reader);
            return (Inner)str; // Or however you want to convert string to Inner
        } else {
            return default(Inner);
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        throw new System.NotImplementedException();
    }
}
于 2011-07-24T16:30:52.150 回答