【问题标题】:Deserialize JSON object in c# using Newtonsoft json.net使用 Newtonsoft json.net 在 c# 中反序列化 JSON 对象
【发布时间】:2017-05-26 11:47:30
【问题描述】:

我有 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);

P.S.我无法更改 JSON Array 的结构。

【问题讨论】:

  • 您可以只使用动态对象而不是您的 DataItem 类吗? JsonConvert.DeserializeObject&lt;IList&lt;Dynamic&gt;&gt;(myJsonArray);?
  • 你可以这样做dynamic data = Json.Decode(json);

标签: c# arrays json json.net windows-10-universal


【解决方案1】:

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

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 数组。我的方法只是显示热从数组中读取一个对象。

现在把事情说清楚。如果您想反序列化一个数组,我建议您使用JsonConvert.DeserializeObject&lt;T&gt;() 方法将输入反序列化到List&lt;JObject&gt;,然后使用我建议您从上面的sn-p 制作的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>();
    }
}

【讨论】:

  • 嗨@m.rogalski,我也试过了。但是在第一行解析 JSON 数组时会出现异常。
  • @KishorBikramOli 请阅读更新后的答案并给我一些反馈。
【解决方案2】:

您可以使用字典来存储来自 JSON 字符串的动态属性数。

以下是将问题中提供的 JSON 字符串成功转换为字典列表的示例。您可以将列表转换为字典数组,而不是列表。

var jsonData = "[{\"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\"}]";

            var data = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonData);

            Console.WriteLine("Total : {0}", data.Count);
            Console.WriteLine("Item1 Total : {0}", data[0].Count);
            Console.WriteLine("Item2 Total : {0}", data[1].Count);

            foreach(var item in data)
            {
                Console.WriteLine("--- Propertie start-----");
                foreach(var kvPair in item)
                {
                    Console.WriteLine("property name : {0}", kvPair.Key);
                    Console.WriteLine("property value : {0}", kvPair.Value);
                }
                Console.WriteLine("--- Propertie end-----");
            }

            Console.ReadLine();

这将解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多