使用不必要的数组反序列化JSON作为第一项

时间:2017-01-11 02:20:26

标签: c# json.net deserialization

[{
        "$type": "foo",
        "key" : "value"
}]

我没有将此消息序列化,它是作为框架的一部分完成的。 数组是不必要的,我只对第一类型和值等感兴趣,这是不变的。

CAN 使用以下代码执行此操作,但它感觉有点讨厌!我知道我特别愚蠢,我开始走上创建SerializationBinder的道路,但后来觉得我想继续我的生活。它可能很难!

                var json = reader.ReadToEnd().TrimStart('[').TrimEnd(']');
                var foo = JsonConvert.DeserializeObject<Foo>(json , new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.All
                });

2 个答案:

答案 0 :(得分:2)

根据注释,示例中的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);

这与第二个解决方案相同,但可以重用于泛型类。

干杯。

答案 1 :(得分:0)

您可以将其反序列化为下面的字典列表

List<Dictionary<string, string>> values = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(a);