如何将复杂的json表示为C#字典

时间:2017-04-03 14:52:12

标签: c# json dictionary

我想将复杂的JSON表示/转换为C#字典。

JSON是

{
"58": { "Power": 26, "Mantissa": 58},
"59": { "Power": 27, "Mantissa": 59},
"60": { "Power": 28, "Mantissa": 60},
"64": { "Power": 0, "Mantissa": 64},
"65": { "Power": 0, "Mantissa": 64},
"66": { "Power": 1, "Mantissa": 65}
}

我认为它可以用C#中的字典词典表示,如

    Dictionary<string, List<Dictionary<string, int>>> dict = new Dictionary<string, List<Dictionary<string, int>>>();

我不知道如何实现这个数据结构。 请帮忙。

3 个答案:

答案 0 :(得分:4)

JSON.NET将能够反序列化你的json:

var dict = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,int>>>(json);

你很接近,但你错过了那个外部词典应该有string作为关键类型。

虽然我认为使用Dictionary<string,int>作为外部字典值类型并不是很好的决定:

  • 您将失去PowerMantissa值的智能感知功能。其他开发人员不会猜测他们应该在字典中查找哪些键。错误输入错误 Matnissa 而非尾数
  • 你会得到字典内部的负担(条目的桶,大小的计数器等)
  • 与访问自定义对象的属性相比,您的代码将运行缓慢(应计算字符串的哈希码,然后应选择适当的bucked,之后应迭代存储桶项以从字典中获取值)。

将其与自定义类用法进行比较:

public class Number
{
    public int Power { get; set; }
    public int Mantissa { get; set; }
}

解析几乎相同:

var numbers = JsonConvert.DeserializeObject<Dictionary<string, Number>>(json);

但访问价值要简单得多,速度更快:

numbers["60"].Mantissa // numbers["60"]["Manitssa"].Value

答案 1 :(得分:3)

试试吧:

public class YourObject{
     public int Power {get;set;}
     public int Mantissa {get;set;}
}

之后,您可以使用Json.NET将JSON转换为YourObject列表:

List<YourObject> list = JsonConvert.DeserializeObject<List<YourObject>>(yourJSONString);

答案 2 :(得分:0)

它很简单。起初我们需要一个像这样的对象:

public class YourObject
{
    public int Power { get; set; }
    public int Mantissa { get; set; }
}

然后试试这个:

    var x = JsonConvert.DeserializeObject<Dictionary<string, YourObject>>(richTextBox1.Text);