【问题标题】:Deserialize Single Dimension JSON Array C#反序列化单维 JSON 数组 C#
【发布时间】:2017-04-20 09:52:45
【问题描述】:

假设下面有多个single-dimensional JSON 数组:

{
    "F" : [ "FG3D2", "FG492", "FG4Q2", "FG562", "FG5Y2", "FG6C2" ],
    "M" : [ "MG3D2", "MG492", "MG4Q2", "MG562", "MG5Y2", "MG6C2" ],
    "N" : [ "NG3D2", "NG492", "NG4Q2", "NG562", "NG5Y2", "NG6C2" ],
    "P" : [ "PG3D2", "PG492", "PG4Q2", "PG562", "PG5Y2", "PG6C2" ]
}

可用于反序列化的适当类设计是什么?当反序列化为Dictionary<string, List<string>> 时,使用 JSON.Net 和 JavascriptSerializer() 进行反序列化但我似乎找不到与此等效的适当类。

以下是我试图作为反序列化基础但失败的类设计:

public class Element
{
    public string Key { get; set; }
    public List<string> Value { get; set; }
}

谢谢。

【问题讨论】:

  • 你需要改变你的json,你想要{ Key:"F", Value:[]}
  • 但我如何对齐它以使类适应 json ?而不是适应类的json。
  • 顺便说一句,这是 JSON 到 POCO 生成的有用工具:http://json2csharp.com/。不完美,但适合实验。
  • 您能否将您的评论转换为答案?你真的拯救了我的一天。

标签: c# arrays json serialization deserialization


【解决方案1】:

你真的需要改变你的 json。就目前而言,你需要一个类似的类

public class Element
{
    public List<string> F {get; set;}
    public List<string> M {get; set;}
    ....
}

要填充现有的类结构,您的 json 应该是:

[
  {"Key":"F", "Value":["FG3D2", "FG492", "FG4Q2", "FG562", "FG5Y2", "FG6C2" ]},
  {"Key":"M", "Value":["MG3D2", "MG492", "MG4Q2", "MG562", "MG5Y2", "MG6C2"]},
]

这对我来说比你现在拥有的更有意义

【讨论】:

  • 虽然它确实有意义,但 json 值在我无法控制的单独 api 上进行了预处理。这就是为什么,我一直在寻找一种适合我的班级的方式。
  • 这很好,所以你想要第一个选项
【解决方案2】:

您必须更改您的 JSON 才能使其正常工作。您必须列出键/值对:

[
    {
        "Key": "F",
        "Value": [ "FG3D2", "FG492", "FG4Q2", "FG562", "FG5Y2", "FG6C2" ]
    },
    {
        "Key": "M",
        "Value": [ "MG3D2", "MG492", "MG4Q2", "MG562", "MG5Y2", "MG6C2" ]        
    },
    {
        "Key": "N",
        "Value": [ "NG3D2", "NG492", "NG4Q2", "NG562", "NG5Y2", "NG6C2" ]
    },
    {
        "Key": "P",
        "Value": [ "PG3D2", "PG492", "PG4Q2", "PG562", "PG5Y2", "PG6C2" ]
    }
]

那么你可以如下转换:

var result = JsonConvert.DeserializeObject<List<RootObject>>(json);

RootObject 在哪里:

class RootObject
{
    public string Key { get; set; }
    public List<string> Value { get; set; }
}

【讨论】:

    【解决方案3】:

    这个怎么样:

        var dic = JsonDeserializer<Dictionary<string, List<string>>>(json);
    
        var els = new List<Element>();
        foreach(var k in dic.Keys)
        {
            els.Add(new Element { Key = k, Value = dic[k] });
        }
    

    现在你有了你想要的对象。

    【讨论】:

    • 这样做的缺点是必须对结果进行迭代,显然效率不高。
    • 你是对的。但我不认为有一种方法可以直接将您的 json 转换为您想要的。它们基本上是两个不同的对象。
    【解决方案4】:

    我猜你可以创建一个继承自字典的类:

    public class Element : Dictionary<string, List<string>>
    { }
    

    【讨论】:

    • 这不是和他说的他不想要的基本一样吗?
    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2016-09-15
    • 2022-11-30
    • 2021-10-13
    • 2017-10-16
    • 2012-09-20
    相关资源
    最近更新 更多