(编辑: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属性或映射来表示?还是我继续沿着自定义转换器路线走?