gpt4 book ai didi

c# - 使用 Newtonsoft json.net 在 C# 中反序列化 JSON 对象

转载 作者:太空宇宙 更新时间:2023-11-03 23:05:03 24 4
gpt4 key购买 nike

我有 JSON 数组。我想将其映射/反序列化为以下类。

public sealed class DataItem{
public string UserId {get; set;}
public string TestId {get; set;}
public string UserName{get; set;}
public string Data1 {get; set;}
public string Data2 {get; set;}
public string Data3 {get; set;}
public string Data4 {get; set;}
public string Data5 {get; set;}
public string Data6 {get; set;}
public string Data7 {get; set;}
public string Data8 {get; set;}
public string Data9 {get; set;}
public string Data10 {get; set;}
...
...
}

JSON 数组:

[{
"UserId": "5656",
"TestId": "562",
"UserName": "testuser",
"Data1": "dang",
"Data2": "phy",
"Data3": "right",
"Data4": "left",
"Data5": "top",
"Data6": "abc",
"Data7": "rat",
"Data8": "test",
"Data9": "91",
"Data10": "9090",
...
...
}, {
"UserId": "8989",
"TestId": "12",
"UserName": "abc",
"Data1": "111",
"Data2": "222",
"Data3": "Pwww",
"Data4": "aaa",
"Data5": "bbbb",
"Data6": "cc",
"Data7": "ooo",
"Data8": "hh",
"Data9": "g",
"Data10": "5656",
...
...

}]

在我的程序中我是这样做的:

IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray);

这很好用。

但在我的例子中,json 数组中大约有 1000 个数据,例如 Data1Data1000 来自数据库。而且我不想在我的类“DataItem”中定义 1000 个数据,例如:

public sealed class DataItem{
...
...
public string Data1 {get; set;}
public string Data2 {get; set;}
.
.
.
public string Data1000 {get; set;}
}

有什么方法可以使用一些动态类或对象来映射这 1000 个数据(Data1 到 Data1000)来解决这个问题。

我正在考虑使用长度为 1000 的数组并像这样映射它们,但我知道这行不通。

 public sealed class DataItem{
public string UserId {get; set;}
public string TestId {get; set;}
public string[] Data {get; set;}
}

public DataItem(){
Data = new string[1000];
}

在我的程序中:

DataItem dataItem = new DataItem();
IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray);

附言我无法更改 JSON 数组的结构。

最佳答案

您可以尝试一些不同的方法:

JObject obj = JObject.Parse(jsonString); // gets processed json object
DataItem item = new DataItem();
item.UserId = obj.SelectToken("UserId").Value<string>();
//.. fill rest of the data
string format = "Data{0}";
for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x]
{
item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>();
}

你可以把它打包成一些奇特的方法,比如:

public DataItem DeserializeFromJson(string json)
{
// put that code in here
}

编辑:

所以问题(如您之前所说)是您有一个 Json 数组。我的方法是只显示热从数组中读取一个对象。

现在把事情说清楚。如果你想反序列化一个数组,我建议将输入反序列化为 List<JObject>使用 JsonConvert.DeserializeObject<T>()方法,然后使用 DeserializeFromJson()我建议您根据上面的代码片段制作的方法。

结合这些,您可以实现如下目标:

public IEnumerable<DataItem> DeserializeListFromJson(string jsonArray)
{
return JsonConverter.DeserializeObject<List<JObject>>(jsonArray).Select( obj => DeserializeFromJson(obj) );
}

// updated
public DataItem DeserializeFromJson(JObject obj)
{
DataItem result = new DataItem();
item.UserId = obj.SelectToken("UserId").Value<string>();
//.. fill rest of the data
string format = "Data{0}";
for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x]
{
item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>();
}
}

关于c# - 使用 Newtonsoft json.net 在 C# 中反序列化 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41595067/

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