gpt4 book ai didi

c# - 首先使用 C# Json.NET 反序列化具有变量名的 Json 数组

转载 作者:行者123 更新时间:2023-11-30 19:04:52 24 4
gpt4 key购买 nike

我从人口普查局的公共(public) api 获得了一个不规则的 JSON 数组。变量名都在第一个元素中,我在反序列化时遇到了问题。

http://api.census.gov/data/2014/pep/agesex?get=AGE,POP,SEX&for=us:*&DATE=7

给我这样的 JSON:

[["AGE","POP","SEX","DATE","us"],
["0","3948350","0","7","1"],
["1","3962123","0","7","1"],
["2","3957772","0","7","1"],
["3","4005190","0","7","1"],
["4","4003448","0","7","1"],
["5","4004858","0","7","1"],
["6","4134352","0","7","1"],
["7","4154000","0","7","1"]]

我可以使用以下方法成功反序列化:

var test1 = JsonConvert.DeserializeObject<String[][]>(jsonStr);

但是,我正在尝试将其反序列化为这样的类:

public class TestClass
{
public string AGE { get; set; }
public string POP { get; set; }
public string SEX { get; set; }
public string DATE { get; set; }
public string us { get; set; }
}

我正在尝试这样做:

var test2 = JsonConvert.DeserializeObject<TestClass[]>(jsonStr);

但是我得到以下异常:

An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code

Additional information: Cannot create and populate list type TestClass. Path '[0]', line 1, position 2.

最佳答案

这有两个部分。

首先是将 JSON 转换为可在 C# 中使用的数据,其次是将该数据转换为漂亮的对象。

这是以下代码的工作 dotNetFiddle.net 示例:https://dotnetfiddle.net/Cr0aRL

JSON 中的每一行都由一个字符串数组组成。所以这是一个字符串数组的数组。在 C# 中可以写成 string[][]。

因此,要使用 JSON.Net 将 JSON 转换为可用数据,您可以执行以下操作:

    var json = "[[\"AGE\",\"POP\",\"SEX\",\"DATE\",\"us\"],[\"0\",\"3948350\",\"0\",\"7\",\"1\"],[\"1\",\"3962123\",\"0\",\"7\",\"1\"],[\"2\",\"3957772\",\"0\",\"7\",\"1\"],[\"3\",\"4005190\",\"0\",\"7\",\"1\"],[\"4\",\"4003448\",\"0\",\"7\",\"1\"],[\"5\",\"4004858\",\"0\",\"7\",\"1\"],[\"6\",\"4134352\",\"0\",\"7\",\"1\"],[\"7\",\"4154000\",\"0\",\"7\",\"1\"]]";
var rawData = JsonConvert.DeserializeObject<string[][]>(json);

接下来是将该数据转换为对象。

第一行是标题,包含列名,所以我们想捕获它,然后找出每个列名的列索引。

    var headerRow = rawData.First();    

var ageIndex = Array.IndexOf(headerRow, "AGE");
var popIndex = Array.IndexOf(headerRow, "POP");
var sexIndex = Array.IndexOf(headerRow, "SEX");
var dateIndex = Array.IndexOf(headerRow, "DATE");
var usIndex = Array.IndexOf(headerRow, "us");

现在我们有了索引,我们需要获取每一行,并将其转换为适当的对象。为此,我使用了 LINQ,因为它非常擅长以清晰的方式表示数据处理。

    var testData = rawData
.Skip(1) //The first row is a header, not data
.Select(dataRow => new TestClass()
{
AGE = dataRow[ageIndex],
POP = dataRow[popIndex],
SEX = dataRow[sexIndex],
DATE = dataRow[dateIndex],
us = dataRow[usIndex]
});

最后进行一些测试,以确保您拥有预期的数据。

    //Get the second data row as an example
var example = testData.Skip(1).First();

//Output example POP to check value
Console.WriteLine(example.POP);

上面的一切都是非常手动的。

您必须知道您期望的 header ,然后手动查找索引,然后手动将行映射到对象。

对于一个简单的用例来说,这样做很可能很好。但在更大和/或更复杂的系统中,您可能希望/需要自动化这些步骤。

自动化这些步骤是可能的,但超出了这个答案的范围,因为你如何处理它可能取决于很多不同的因素。

关于c# - 首先使用 C# Json.NET 反序列化具有变量名的 Json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36133212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com