[{
"$type": "foo",
"key" : "value"
}]
我不序列化此消息,它是作为框架的一部分完成的。数组是不必要的,我只对第一种类型和值等感兴趣,这是不变的。
我可以使用以下代码来做到这一点,但感觉有点讨厌!我知道我特别愚蠢,我开始走上创建序列化活页夹的道路,但后来我想我想继续我的生活。 不可能那么难!
var json = reader.ReadToEnd().TrimStart('[').TrimEnd(']');
var foo = JsonConvert.DeserializeObject<Foo>(json , new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
});
根据注释,示例中的JSON
字符串是有效的 JSON 数组。因此,最好的解决方案是将 JSON 解析为数组,然后捕获第一个元素。一个基本的例子是。
var foo = JsonConvert.DeserializeObject<Foo[]>(json)[0]
为了更安全的处理方式,首先获取数组,然后检查结果是否有效,例如。
Foo foo = fooArray.Length > 0 ? fooArray[0] : null;
对于更通用的解决方案,可以作为通用方法完成。
static T DeserializeObjectFromArray<T>(string json)
where T: class
{
var arr = JsonConvert.DeserializeObject<T[]>(json);
return arr != null && arr.Length > 0 ? arr[0] : null;
}
在此方法中,您可以简单地调用
Foo foo = DeserializeObjectFromArray<Foo>(json);
这与第二个解决方案相同,但可以重用于泛型类。
干杯。
您可以将其反序列化为字典列表,如下所示
List<Dictionary<string, string>> values = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(a);