我一直在尝试使用此网站和其他网站上类似问题的帮助将以下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; }
}
答案 0 :(得分:5)
这是一个有效的dotNet小提琴,用于反序列化Values
列表。 https://dotnetfiddle.net/7P2em6
加载小提琴时等待几秒钟,并在控制台窗口中注意输出。代码应该是不言自明的,但如果您需要帮助,请告诉我。
如果dotNetFiddle不可用,我也会在下面粘贴它以获得完整性。
控制台输出:
我使用http://json2csharp.com/从JSON字符串生成类。
我认为您的问题可能是Values
在List
对象中是Row
,而List
在RootObject
内是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; }
}