将复杂的json转换为c#类

时间:2014-11-25 17:21:39

标签: c# json json.net

我一直在尝试使用此网站和其他网站上类似问题的帮助将以下json数据反序列化为2天的类,并且可能会导致脑死亡。

我有这个json数据(长度道歉)并且正在尝试,作为开始获取'Values'数组中的'value'数字: -

{
  "metadata": {
    "columnGrouping": [
      "area",
      "metricType",
      "period",
      "valueType"
    ],
    "rowGrouping": []
  },
  "columns": [
    {
      "area": {
        "identifier": "E31000040",
        "label": "Gtr Manchester Fire",
        "altLabel": "Gtr Manchester Fire",
        "isSummary": false
      },
      "metricType": {
        "identifier": "948",
        "label": "Accidental dwelling fires",
        "altLabel": "Accidental dwelling fires",
        "isSummary": false
      },
      "period": {
        "identifier": "fq_Q1_2013_14",
        "label": "2013/14 Q1",
        "altLabel": "2013/14 Q1",
        "isSummary": false
      },
      "valueType": {
        "identifier": "raw",
        "label": "Raw value",
        "isSummary": false
      }
    },
    {
      "area": {
        "identifier": "E31000040",
        "label": "Gtr Manchester Fire",
        "altLabel": "Gtr Manchester Fire",
        "isSummary": false
      },
      "metricType": {
        "identifier": "948",
        "label": "Accidental dwelling fires",
        "altLabel": "Accidental dwelling fires",
        "isSummary": false
      },
      "period": {
        "identifier": "fq_Q2_2013_14",
        "label": "2013/14 Q2",
        "altLabel": "2013/14 Q2",
        "isSummary": false
      },
      "valueType": {
        "identifier": "raw",
        "label": "Raw value",
        "isSummary": false
      }
    },
    {
      "area": {
        "identifier": "E31000040",
        "label": "Gtr Manchester Fire",
        "altLabel": "Gtr Manchester Fire",
        "isSummary": false
      },
      "metricType": {
        "identifier": "948",
        "label": "Accidental dwelling fires",
        "altLabel": "Accidental dwelling fires",
        "isSummary": false
      },
      "period": {
        "identifier": "fq_Q3_2013_14",
        "label": "2013/14 Q3",
        "altLabel": "2013/14 Q3",
        "isSummary": false
      },
      "valueType": {
        "identifier": "raw",
        "label": "Raw value",
        "isSummary": false
      }
    },
    {
      "area": {
        "identifier": "E31000040",
        "label": "Gtr Manchester Fire",
        "altLabel": "Gtr Manchester Fire",
        "isSummary": false
      },
      "metricType": {
        "identifier": "948",
        "label": "Accidental dwelling fires",
        "altLabel": "Accidental dwelling fires",
        "isSummary": false
      },
      "period": {
        "identifier": "fq_Q4_2013_14",
        "label": "2013/14 Q4",
        "altLabel": "2013/14 Q4",
        "isSummary": false
      },
      "valueType": {
        "identifier": "raw",
        "label": "Raw value",
        "isSummary": false
      }
    }
  ],
  "rows": [
    {
      "values": [
        {
          "source": 515.0,
          "value": 515.0,
          "formatted": "515",
          "format": "#,##0",
          "publicationStatus": "Published"
        },
        {
          "source": 264.0,
          "value": 264.0,
          "formatted": "264",
          "format": "#,##0",
          "publicationStatus": "Published"
        },
        {
          "source": 254.0,
          "value": 254.0,
          "formatted": "254",
          "format": "#,##0",
          "publicationStatus": "Published"
        },
        {
          "source": 455.0,
          "value": 455.0,
          "formatted": "455",
          "format": "#,##0",
          "publicationStatus": "Published"
        }
      ]
    }
  ]
}

我使用http://json2csharp.com/创建了类,并尝试过以下方法: -

RootObject ro = JsonConvert.DeserializeObject<RootObject>(json_data);

Value [] vo = JsonConvert.DeserializeObject<Value[]>(json_data);

dynamic result = JsonConvert.DeserializeObject(json_data);

JavaScriptSerializer jss = new JavaScriptSerializer();
Value [] thisval = jss.Deserialize<Value[]>(json_data);

其中。 什么是将他的信息提取到类中的正确方法,然后我可以处理它们。一旦反序列化调用数据的示例将是有帮助的。 我有的主要课程是

public class Value
{
    public double source { get; set; }
    public double value { get; set; }
    public string formatted { get; set; }
    public string format { get; set; }
    public string publicationStatus { get; set; }
}

public class Row
{
    public List<Value> values { get; set; }
}

public class RootObject
{
    public Metadata metadata { get; set; }
    public List<Column> columns { get; set; }
    public List<Row> rows { get; set; }
}

2 个答案:

答案 0 :(得分:5)

这是一个有效的dotNet小提琴,用于反序列化Values列表。 https://dotnetfiddle.net/7P2em6

加载小提琴时等待几秒钟,并在控制台窗口中注意输出。代码应该是不言自明的,但如果您需要帮助,请告诉我。

如果dotNetFiddle不可用,我也会在下面粘贴它以获得完整性。

控制台输出:

deserialize complex json to c# class

我使用http://json2csharp.com/从JSON字符串生成类。

我认为您的问题可能是ValuesList对象中是Row,而ListRootObject内是Value }。换句话说,List被存储为List内的using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Runtime.Serialization; using System.Web; using Newtonsoft.Json.Linq; using Newtonsoft.Json; // SO Question: http://stackoverflow.com/questions/27132887/ // This (my) Answer: // Author: Shiva Manjunath // SO Profile: http://stackoverflow.com/users/325521/shiva public class Program { public static void Main() { string jsonString = @"{ ""metadata"": { ""columnGrouping"": [ ""area"", ""metricType"", ""period"", ""valueType"" ], ""rowGrouping"": [] }, ""columns"": [ { ""area"": { ""identifier"": ""E31000040"", ""label"": ""Gtr Manchester Fire"", ""altLabel"": ""Gtr Manchester Fire"", ""isSummary"": false }, ""metricType"": { ""identifier"": ""948"", ""label"": ""Accidental dwelling fires"", ""altLabel"": ""Accidental dwelling fires"", ""isSummary"": false }, ""period"": { ""identifier"": ""fq_Q1_2013_14"", ""label"": ""2013/14 Q1"", ""altLabel"": ""2013/14 Q1"", ""isSummary"": false }, ""valueType"": { ""identifier"": ""raw"", ""label"": ""Raw value"", ""isSummary"": false } }, { ""area"": { ""identifier"": ""E31000040"", ""label"": ""Gtr Manchester Fire"", ""altLabel"": ""Gtr Manchester Fire"", ""isSummary"": false }, ""metricType"": { ""identifier"": ""948"", ""label"": ""Accidental dwelling fires"", ""altLabel"": ""Accidental dwelling fires"", ""isSummary"": false }, ""period"": { ""identifier"": ""fq_Q2_2013_14"", ""label"": ""2013/14 Q2"", ""altLabel"": ""2013/14 Q2"", ""isSummary"": false }, ""valueType"": { ""identifier"": ""raw"", ""label"": ""Raw value"", ""isSummary"": false } }, { ""area"": { ""identifier"": ""E31000040"", ""label"": ""Gtr Manchester Fire"", ""altLabel"": ""Gtr Manchester Fire"", ""isSummary"": false }, ""metricType"": { ""identifier"": ""948"", ""label"": ""Accidental dwelling fires"", ""altLabel"": ""Accidental dwelling fires"", ""isSummary"": false }, ""period"": { ""identifier"": ""fq_Q3_2013_14"", ""label"": ""2013/14 Q3"", ""altLabel"": ""2013/14 Q3"", ""isSummary"": false }, ""valueType"": { ""identifier"": ""raw"", ""label"": ""Raw value"", ""isSummary"": false } }, { ""area"": { ""identifier"": ""E31000040"", ""label"": ""Gtr Manchester Fire"", ""altLabel"": ""Gtr Manchester Fire"", ""isSummary"": false }, ""metricType"": { ""identifier"": ""948"", ""label"": ""Accidental dwelling fires"", ""altLabel"": ""Accidental dwelling fires"", ""isSummary"": false }, ""period"": { ""identifier"": ""fq_Q4_2013_14"", ""label"": ""2013/14 Q4"", ""altLabel"": ""2013/14 Q4"", ""isSummary"": false }, ""valueType"": { ""identifier"": ""raw"", ""label"": ""Raw value"", ""isSummary"": false } } ], ""rows"": [ { ""values"": [ { ""source"": 515.0, ""value"": 515.0, ""formatted"": ""515"", ""format"": ""#,##0"", ""publicationStatus"": ""Published"" }, { ""source"": 264.0, ""value"": 264.0, ""formatted"": ""264"", ""format"": ""#,##0"", ""publicationStatus"": ""Published"" }, { ""source"": 254.0, ""value"": 254.0, ""formatted"": ""254"", ""format"": ""#,##0"", ""publicationStatus"": ""Published"" }, { ""source"": 455.0, ""value"": 455.0, ""formatted"": ""455"", ""format"": ""#,##0"", ""publicationStatus"": ""Published"" } ] } ] }"; Console.WriteLine("Begin JSON Deserialization\n"); var rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString); var rows = rootObject.rows; int rowCounter = 1; foreach (Row oneRow in rows) { Console.WriteLine("Row: " + rowCounter); int valueCounter = 1; foreach(Value oneValue in oneRow.values) { Console.WriteLine(" Value: " + valueCounter); Console.WriteLine(" source: " + oneValue.source); Console.WriteLine(" value: " + oneValue.value); Console.WriteLine(" formatted: " + oneValue.formatted); Console.WriteLine(" publicationStatus: " + oneValue.publicationStatus); valueCounter++; } rowCounter++; } Console.WriteLine("\nEnd JSON Deserialization"); } } public class Metadata { public List<string> columnGrouping { get; set; } } public class Area { public string identifier { get; set; } public string label { get; set; } public string altLabel { get; set; } public bool isSummary { get; set; } } public class MetricType { public string identifier { get; set; } public string label { get; set; } public string altLabel { get; set; } public bool isSummary { get; set; } } public class Period { public string identifier { get; set; } public string label { get; set; } public string altLabel { get; set; } public bool isSummary { get; set; } } public class ValueType { public string identifier { get; set; } public string label { get; set; } public bool isSummary { get; set; } } public class Column { public Area area { get; set; } public MetricType metricType { get; set; } public Period period { get; set; } public ValueType valueType { get; set; } } public class Value { public double source { get; set; } public double value { get; set; } public string formatted { get; set; } public string format { get; set; } public string publicationStatus { get; set; } } public class Row { public List<Value> values { get; set; } } public class RootObject { public Metadata metadata { get; set; } public List<Column> columns { get; set; } public List<Row> rows { get; set; } }

完整的代码清单

columns

注意:对于columns对象,您不需要单独的字段类(json2csharp.com类生成器将默认为该类)。您可以将值存储在字典类中的{{1}}对象中(如果您知道它们的名称将是唯一的)。对于它的实现(不同的JSON字符串,但相同的json模式类型,原则),请看这个小提琴:https://dotnetfiddle.net/7bFcNM

答案 1 :(得分:2)

使用json到C#生成器,如JSON C# Class Generator

如果重命名属性并使它们与json的名称匹配,则可以使用Lists替换数组并删除JsonProperty属性。

这是输出:

internal class Test
{
    [JsonProperty("metadata")]
    public Metadata Metadata { get; set; }

    [JsonProperty("columns")]
    public Column[] Columns { get; set; }

    [JsonProperty("rows")]
    public Row[] Rows { get; set; }
}

internal class Metadata
{    
    [JsonProperty("columnGrouping")]
    public string[] ColumnGrouping { get; set; }

    [JsonProperty("rowGrouping")]
    public object[] RowGrouping { get; set; }
}

internal class Area
{   
    [JsonProperty("identifier")]
    public string Identifier { get; set; }

    [JsonProperty("label")]
    public string Label { get; set; }

    [JsonProperty("altLabel")]
    public string AltLabel { get; set; }

    [JsonProperty("isSummary")]
    public bool IsSummary { get; set; }
}

internal class MetricType
{   
    [JsonProperty("identifier")]
    public string Identifier { get; set; }

    [JsonProperty("label")]
    public string Label { get; set; }

    [JsonProperty("altLabel")]
    public string AltLabel { get; set; }

    [JsonProperty("isSummary")]
    public bool IsSummary { get; set; }
}

internal class Period
{   
    [JsonProperty("identifier")]
    public string Identifier { get; set; }

    [JsonProperty("label")]
    public string Label { get; set; }

    [JsonProperty("altLabel")]
    public string AltLabel { get; set; }

    [JsonProperty("isSummary")]
    public bool IsSummary { get; set; }
}

internal class ValueType
{   
    [JsonProperty("identifier")]
    public string Identifier { get; set; }

    [JsonProperty("label")]
    public string Label { get; set; }

    [JsonProperty("isSummary")]
    public bool IsSummary { get; set; }
}

internal class Column
{  
    [JsonProperty("area")]
    public Area Area { get; set; }

    [JsonProperty("metricType")]
    public MetricType MetricType { get; set; }

    [JsonProperty("period")]
    public Period Period { get; set; }

    [JsonProperty("valueType")]
    public ValueType ValueType { get; set; }
}

internal class Value
{ 
    [JsonProperty("source")]
    public double Source { get; set; }

    [JsonProperty("value")]
    public double Value { get; set; }

    [JsonProperty("formatted")]
    public string Formatted { get; set; }

    [JsonProperty("format")]
    public string Format { get; set; }

    [JsonProperty("publicationStatus")]
    public string PublicationStatus { get; set; }
}

internal class Row
{ 
    [JsonProperty("values")]
    public Value[] Values { get; set; }
}