c# - 使用 Json.NET 反序列化键值对数组

标签 c# json.net deserialization

给定以下 json:

[ {"id":"123", ... "data":[{"key1":"val1"}, {"key2":"val2"}], ...}, ... ]

那是更大树的一部分,我怎样才能将“数据”属性反序列化为:

List<MyCustomClass> Data { get; set; }

List<KeyValuePair> Data { get; set; }

Dictionary<string, string> Data { get; set; }

使用 Json.NET?任何一个版本都可以(不过我更喜欢 List of MyCustomClass)。我已经有一个包含其他属性的类,如下所示:

public class SomeData
{
   [JsonProperty("_id")]
   public string Id { get; set; }
   ...
   public List<MyCustomClass> Data { get; set; }
}

其中“MyCustomClass”将仅包含两个属性(键和值)。我注意到有一个 KeyValuePairConverter 类听起来可以满足我的需要,但我找不到有关如何使用它的示例。谢谢。

最佳答案

最简单的方法是将键值对数组反序列化为 IDictionary<string, string> :


public class SomeData
{
    public string Id { get; set; }

    public IEnumerable<IDictionary<string, string>> Data { get; set; }
}

private static void Main(string[] args)
{
    var json = "{ \"id\": \"123\", \"data\": [ { \"key1\": \"val1\" }, { \"key2\" : \"val2\" } ] }";

    var obj = JsonConvert.DeserializeObject<SomeData>(json);
}

但是如果你需要将它反序列化到你自己的类中,它可能看起来像这样:


public class SomeData2
{
    public string Id { get; set; }

    public List<SomeDataPair> Data { get; set; }
}

public class SomeDataPair
{
    public string Key { get; set; }

    public string Value { get; set; }
}

private static void Main(string[] args)
{
    var json = "{ \"id\": \"123\", \"data\": [ { \"key1\": \"val1\" }, { \"key2\" : \"val2\" } ] }";

    var rawObj = JObject.Parse(json);

    var obj2 = new SomeData2
    {
        Id = (string)rawObj["id"],
        Data = new List<SomeDataPair>()
    };

    foreach (var item in rawObj["data"])
    {
        foreach (var prop in item)
        {
            var property = prop as JProperty;

            if (property != null)
            {
                obj2.Data.Add(new SomeDataPair() { Key = property.Name, Value = property.Value.ToString() });
            }

        }
    }
}

看到我知道Valuestring我调用ToString()方法,可以有另一个复杂的类。

关于c# - 使用 Json.NET 反序列化键值对数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15789539/

相关文章:

json - 如何使用 Play API 反序列化 JSON 数组

c# - 如何使用匿名方法设置线程名称?

c# - 类型 'Object' 在未被 .Net Core 项目引用的程序集中定义

c# - 当需要更多空间时,列表会在 C# 中加倍空间。在某些时候,将 1024 加倍到 2048 会变得效率降低吗?

c# - 检测到自引用循环 - 从 WebApi 获取数据到浏览器

c# - 使用 JSON.Net 解析 ISO 持续时间

java - 什么反序列化 GWT RPC 调用客户端

kotlin - 如何一般地使用泛型反序列化Jackson容器

c# - 在 web.config 文件中添加命名空间有什么好处?

c# - 从 JObject JSON.Net 读取日期