【问题标题】:Cannot find a way to Deserialize Json indexed array using Json.Net找不到使用 Json.Net 反序列化 Json 索引数组的方法
【发布时间】:2015-04-27 03:01:09
【问题描述】:

我正在想办法反序列化 Json 类型的对象:

{
     "0": { "course": { name: "<cource name", .... } },
     "1": { "course": { name: "<cource name", .... } },
     "success": true
}

进入

List<Course>

在哪里

public class Course 
{
    public string Name { get; set; }
}

问题在于它不是一个“命名”数组,它有索引来代替属性名称。该数组是动态的,即包含许多元素,即“0”、“1”、“2”等。有没有一种简单的方法可以通过 Json.NET 对其进行反序列化。我显然可以将它反序列化为动态对象,然后一个一个地创建一个 for 循环和查找索引,但我认为 Json.Net 可能对此有更优雅的东西。

【问题讨论】:

  • 开始编码循环。
  • 由于索引可以在任何范围内变化..您可能应该使用带循环的动态..

标签: c# json serialization json.net deserialization


【解决方案1】:

您可以使用 Json.Net 的 Linq-to-Json API (JObjects) 来解析 JSON 并将其转换为您想要的结构。例如:

string json = @"
{
     ""0"": { ""course"": { name: ""Foo"" } },
     ""1"": { ""course"": { name: ""Bar"" } },
     ""success"": true
}";

JObject jo = JObject.Parse(json);
List<Course> courses = jo.Properties()
    .Where(p => p.Name != "success")
    .Select(p => p.Value["course"].ToObject<Course>())
    .ToList();

foreach (Course c in courses)
{
    Console.WriteLine(c.Name);
}

输出:

Foo
Bar

小提琴:https://dotnetfiddle.net/cpN2DE

【讨论】:

  • 是的,我已经做过类似的事情了。我反序列化为 JObject,然后放置一个 while 循环以继续迭代,直到没有剩余索引并将每个值反序列化为 Course。无论如何,它与您的相似,因此标记为答案。
【解决方案2】:

尝试为课程对象制作字典:

public class MyData{
  [JsonProperty("success")]
  public bool Success {get;set;}

  public Dictionary<string,Course> Courses{get; private set;}

  public MyData(){
    Courses = new Dictionary<string, Course>();
  } 
}

如果你的索引是一个整数,你可以Dictionary&lt;int, Course&gt;

【讨论】:

  • 问题在于愚蠢的“成功”属性不适合
  • 您尝试过我在这里建议的确切结构吗? Newtonsoft Json 反序列化器能够将未分配的标签分配到包罗万象的字典中,它应该可以工作,也许需要一些调整
猜你喜欢
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多