NewtonSoft Json-如何反序列化具有未知属性的对象

时间:2019-02-22 20:37:49

标签: c# json json.net json-deserialization

(编辑:JSON对象是一个字典,可以在本地反序列化为实现IDictionary的对象。请参阅重复的问题。)

我正在从API反序列化JSON数据,并且返回数据的格式对我来说有点奇怪。我以前从未见过像这样的结构,我希望有一种无需构建自定义转换器即可反序列化的方法。

{
    "1000" : {
        "id" : 1000, 
        "prop2" : "value2", 
        "prop3" : "value3"
    }, 
    "1001" : {
        "id" : 1001, 
        "prop2" : "value2", 
        "prop3" : "value3"
    }, 
    "XXXX" : {
        "id" : XXXX, 
        "prop2" : "value2", 
        "prop3" : "value3"
    }
}

从示例中可以看到,它不是对象数组,而是对象,其中属性名称是子对象ID的字符串值。这来自HubSpot,您可以在此处查看API文档:https://developers.hubspot.com/docs/methods/contacts/get_batch_by_email

我已经开始创建自定义JSON转换器了,我还不很早就开始测试。 (我通常不需要这样做,而且每次都必须重新学习。)

[JsonConverter(typeof(EmailContactConverter))]
internal class EmailContactListResponse
{
    public IEnumerable<ContactResponse> Contacts { get; set; }
}

class EmailContactConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException("Not implemented yet");
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return string.Empty;
        }
        else if (reader.TokenType == JsonToken.String)
        {
            return serializer.Deserialize(reader, objectType);
        }
        else
        {
            JObject obj = JObject.Load(reader);
            var list = new List<ContactResponse>();
            return list;
        }
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override bool CanConvert(Type objectType)
    {
        return false;
    }
}

有没有一种方法可以使用内置的NewtonSoft JSON属性或映射来表示?还是我继续沿着自定义转换器路线走?

0 个答案:

没有答案