繁体   English   中英

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

[英]Deserialise JSON with unnecessary array as first item

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

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

可以做使用下面的代码,但它只是感觉有点讨厌! 我知道自己特别愚蠢,我开始着手创建SerializationBinder,但是后来我想继续生活。 没那么难!

                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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM