C# 如何用C反序列化分组的JSON数据#

C# 如何用C反序列化分组的JSON数据#,c#,json,.net,serialization,deserialization,C#,Json,.net,Serialization,Deserialization,我一直在努力反序列化这个JSON字符串,我想有人可以帮我 这是json { "22/7/2020": { "0": { "date": null, "time": "9:00 pm", "place": "London", "name": "Date night&quo

我一直在努力反序列化这个JSON字符串,我想有人可以帮我

这是json

{
  "22/7/2020": {
    "0": {
      "date": null,
      "time": "9:00 pm",
      "place": "London",
      "name": "Date night"
    },
    "1": {
      "date": null,
      "time": "2:30 pm",
      "place": "London",
      "name": "Lunch"
    }
  },
  "23/7/2020": {
    "0": {
      "date": null,
      "time": "1:00 pm",
      "place": "Cafe",
      "name": "Coffee Meeting"
    }
  },
  "24/7/2020": {
    "0": {
      "date": null,
      "time": "3:00 pm",
      "place": "London",
      "name": "Run"
    },
    "27/7/2020": {
      "0": {
        "date": null,
        "time": "6:00 pm",
        "place": "Mountains",
        "name": "Hiking"
      }
    },
    "30/7/2020": {
      "0": {
        "date": null,
        "time": "10:00 am",
        "place": "Solo Cafe",
        "name": "Brunch"
      }
    },
    "3/8/2020": {
      "0": {
        "date": null,
        "time": "8:00 pm",
        "place": "London",
        "name": "Drinks"
      },
      "1": {
        "date": null,
        "time": "11:00 am",
        "place": "Work",
        "name": "Work"
      },
      "2": {
        "date": null,
        "time": "6:00 pm",
        "place": "Grandma's",
        "name": "Dinner with Grandma"
      }
    }
  }
}
正如您所看到的,对象分组在date元素下,date元素创建了这种嵌套结构,我的问题是我不知道如何将其反序列化到对象列表中。我试着这样做:

使用这两个类

public class events_final
{
    [DataMember]
    public string Date { get; set; }

    [DataMember]
    public List<details> Event_Details { get; set; }
}
public class details
{
    [DataMember]
    public string date { get; set; }

    [DataMember]
    public string time { get; set; }

    [DataMember]
    public string place { get; set; }

    [DataMember]
    public string name { get; set; }
}
public class events\u final
{
[数据成员]
公共字符串日期{get;set;}
[数据成员]
公共列表事件_详细信息{get;set;}
}
公开课详情
{
[数据成员]
公共字符串日期{get;set;}
[数据成员]
公共字符串时间{get;set;}
[数据成员]
公共字符串place{get;set;}
[数据成员]
公共字符串名称{get;set;}
}
这样做:

var Deserialized_Json = JsonConvert.DeserializeObject<List<details>>(json_string);
var Deserialized_Json=JsonConvert.DeserializeObject(Json_字符串);
但是,这不起作用,相反,我得到了所有这些错误:

at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x003a0] in <2073514815234917a5e8f91b0b239405>:0 
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x0006d] in <2073514815234917a5e8f91b0b239405>:0 
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType, System.Boolean checkAdditionalContent) [0x000db] in <2073514815234917a5e8f91b0b239405>:0 
  at Newtonsoft.Json.JsonSerializer.DeserializeInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00054] in <2073514815234917a5e8f91b0b239405>:0 
  at Newtonsoft.Json.JsonSerializer.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00000] in <2073514815234917a5e8f91b0b239405>:0 
  at Newtonsoft.Json.JsonConvert.DeserializeObject (System.String value, System.Type type, Newtonsoft.Json.JsonSerializerSettings settings) [0x0002d] in <2073514815234917a5e8f91b0b239405>:0 
  at Newtonsoft.Json.JsonConvert.DeserializeObject[T] (System.String value, Newtonsoft.Json.JsonSerializerSettings settings) [0x00000] in <2073514815234917a5e8f91b0b239405>:0 
  at Newtonsoft.Json.JsonConvert.DeserializeObject[T] (System.String value) [0x00000] in <2073514815234917a5e8f91b0b239405>:0
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Newtonsoft.Json.JsonReader阅读器,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract契约,Newtonsoft.Json.Serialization.JsonProperty成员,Newtonsoft.Json.Serialization.JsonContainerContract容器契约,Newtonsoft.Json.Serialization.JsonProperty容器成员,System.Object existingValue)[0x003a0]in:0
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReader阅读器,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract契约,Newtonsoft.Json.Serialization.JsonProperty成员,Newtonsoft.Json.Serialization.JsonContainerContract容器契约,Newtonsoft.Json.Serialization.JsonProperty容器成员,System.Object existingValue)[0x0006d]in:0
在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Newtonsoft.Json.JsonReader,System.Type objectType,System.Boolean checkAdditionalContent)[0x000db]中:0
位于Newtonsoft.Json.JsonSerializer.DeserializeInternal(Newtonsoft.Json.JsonReader reader,System.Type objectType)[0x00054]中:0
在Newtonsoft.Json.JsonSerializer.Deserialize(Newtonsoft.Json.JsonReader reader,System.Type objectType)[0x00000]中:0
在Newtonsoft.Json.JsonConvert.DeserializeObject(System.String值,System.Type类型,Newtonsoft.Json.JsonSerializerSettings设置)[0x0002d]中:0
在Newtonsoft.Json.JsonConvert.DeserializeObject[T](System.String值,Newtonsoft.Json.JsonSerializerSettings设置)[0x00000]中:0
0中的Newtonsoft.Json.JsonConvert.DeserializeObject[T](System.String值)[0x00000]处

如果有人能帮我将其反序列化为一个列表,我将不胜感激。

鉴于您已更正的json,它以各种方式出现(叹气)

用法

var results = JsonConvert
   .DeserializeObject<Dictionary<string, Dictionary<string, details>>>(input)
   .SelectMany(x =>
      x.Value.Select(y =>
         new details
         {
            date = x.Key,
            time = y.Value.time,
            place = y.Value.place,
            name = y.Value.name
         }));

foreach (var r in results)
   Console.WriteLine($"{r.date}, {r.time}, {r.place}, {r.name}");  

除了将军(阿勒丁上将)的回答外,我还有一个关于上述问题的备选但不是很有效的答案(只是想为这个问题指出一个额外的解决方案),您可以使用
ExpandoObject
反序列化,然后循环数据

var result = JsonConvert.DeserializeObject<ExpandoObject>(jsonStringAbove);
输出:

22/7/2020 time - 9:00 pm place - London name - Date night
22/7/2020 time - 2:30 pm place - London name - Lunch
23/7/2020 time - 1:00 pm place - Cafe name - Coffee Meeting
24/7/2020 time - 3:00 pm place - London name - Run
27/7/2020 time - 6:00 pm place - Mountains name - Hiking
30/7/2020 time - 10:00 am place - Solo Cafe name - Brunch
3/8/2020 time - 8:00 pm place - London name - Drinks
3/8/2020 time - 11:00 am place - Work name - Work
3/8/2020 time - 6:00 pm place - Grandma's name - Dinner with Grandma

我明白了,你想要一个结果列表,你可以这样实现:

foreach (var item in result)
{
    var date = item.Key;
    foreach (var item1 in (ExpandoObject)item.Value)
    {
        foreach (var item2 in (ExpandoObject)item1.Value)
        {
            if (item2.Key.Equals("date"))
            {
                Console.Write($"{date} ");
                continue;
            }
            Console.Write($"{item2.Key} - {item2.Value}");
        }
        Console.WriteLine();
    }
}
List<details> listDetails = new List<details>();
foreach (var item in result)
{
    foreach (var item1 in (ExpandoObject)item.Value)
    {
        var detail = new details { date = item.Key };
        foreach (var item2 in (ExpandoObject)item1.Value)
        {
            if (item2.Key == "time")
            {
                detail.time = item2.Value.ToString();
            }
            else if (item2.Key == "place")
            {
                detail.place = item2.Value.ToString();
            }
            else if (item2.Key == "name")
            {
                detail.name = item2.Value.ToString();
            }
        }
        listDetails.Add(detail);
    }
}
List listDetails=new List();
foreach(结果中的var项目)
{
foreach(变量item1在(expandooobject)item.Value中)
{
var detail=new details{date=item.Key};
foreach(变量项2在(expandooobject)项1.Value中)
{
如果(item2.Key==“时间”)
{
detail.time=item2.Value.ToString();
}
else if(item2.Key==“place”)
{
detail.place=item2.Value.ToString();
}
else if(item2.Key==“name”)
{
detail.name=item2.Value.ToString();
}
}
listDetails.Add(细节);
}
}

您的C#类必须与JSON的格式相匹配。您不能在C#中设置任意对象,然后像“好的,JSON.NET。去解决它。”。也许你应该尝试反序列化到
字典
?这会很棘手,你的json字段名实际上是任意日期。我会像John说的那样尝试,否则你必须使用一些自定义代码
22/7/2020 time - 9:00 pm place - London name - Date night
22/7/2020 time - 2:30 pm place - London name - Lunch
23/7/2020 time - 1:00 pm place - Cafe name - Coffee Meeting
24/7/2020 time - 3:00 pm place - London name - Run
27/7/2020 time - 6:00 pm place - Mountains name - Hiking
30/7/2020 time - 10:00 am place - Solo Cafe name - Brunch
3/8/2020 time - 8:00 pm place - London name - Drinks
3/8/2020 time - 11:00 am place - Work name - Work
3/8/2020 time - 6:00 pm place - Grandma's name - Dinner with Grandma
List<details> listDetails = new List<details>();
foreach (var item in result)
{
    foreach (var item1 in (ExpandoObject)item.Value)
    {
        var detail = new details { date = item.Key };
        foreach (var item2 in (ExpandoObject)item1.Value)
        {
            if (item2.Key == "time")
            {
                detail.time = item2.Value.ToString();
            }
            else if (item2.Key == "place")
            {
                detail.place = item2.Value.ToString();
            }
            else if (item2.Key == "name")
            {
                detail.name = item2.Value.ToString();
            }
        }
        listDetails.Add(detail);
    }
}