【问题标题】:Deserialize JSON with dynamic objects使用动态对象反序列化 JSON
【发布时间】:2014-05-06 21:46:50
【问题描述】:

我有一个带有一长串区号的 JSON 对象。不幸的是,每个区号都是 Data 对象列表中的对象名称。如何创建一个允许 RestSharp 反序列化内容的类?

这是我的班级现在的样子:

public class phaxioResponse
{
    public string success { get; set; }
    public string message { get; set; }
    public List<areaCode> data { get; set; }

    public class areaCode
    {
        public string city { get; set; }
        public string state { get; set; }
    }
}

这是 JSON 内容:

{
    success: true
    message: "277 area codes available."
    data: {
        201: {
            city: "Bayonne, Jersey City, Union City"
            state: "New Jersey"
        }
        202: {
            city: "Washington"
        state: "District Of Columbia"
        } [...]
}

【问题讨论】:

  • 那个 json 搞砸了。
  • 你真的希望任何人都能阅读所有这些内容吗?
  • @JohnSaunders 您不需要通过阅读整个 json 对象-我很确定您可以看到主对象中只有三个节点,并且数据对象一直是相同的通过?
  • 如果我们不需要阅读它,那为什么要发布它?
  • 我不明白这里对提问者的蔑视,人们基本上会调用任何旧垃圾json并期望你处理它。我见过“json”数据,它是一个列表列表,其中第一个列表是列名,其余的是值列表...

标签: c# json restsharp


【解决方案1】:

由于这个 JSON 对 C# 不友好,我不得不做一些小技巧来让它正确输出。不过效果还是不错的。

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson);
var data = ((JObject)json.data).Children();
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] });

此代码将生成最能代表数据的匿名类型。但是,匿名类型可以很容易地被 ctor 替换,以获得更正常的 DTO 类。

输出看起来像这样:

【讨论】:

  • 您能解释一下 json.data 中的 data 是什么吗?谢谢
  • @HappyBird,这来自问题中发布的示例 JSON。
【解决方案2】:

您的 json 不正确,但如果您纠正了它,您可以使用 json-to-csharp 工具,例如 http://json2csharp.com/ 上的工具来生成您的类:

public class __invalid_type__201
{
    public string city { get; set; }
    public string state { get; set; }
}

public class Data
{
    public __invalid_type__201 __invalid_name__201 { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}

【讨论】:

  • 这是个好主意...不幸的是 JSON 不在我的手中 - 它来自外部 API
  • @PeteFox 它不是有效的 JSON。所有字段名称都应该用引号括起来,才能被视为有效的 JSON。这就是 json2csharp.com 生成无效类的原因。
【解决方案3】:

我对 RestSharp 一无所知,但如果您在服务器端使用 Newtonsoft,那么您只需将 JObject 传递给您的方法。然后你可以查询对象,看看它到底是什么类型的对象,并使用 JObject.ToObject() 来转换它。

【讨论】:

    【解决方案4】:

    我认为使用Dictionary&lt;int,areaCode&gt; 是最简单的方法。

    public class phaxioResponse
        {
            public string success { get; set; }
            public string message { get; set; }
            public Dictionary<int,areaCode> data { get; set; }
    
            public class areaCode
            {
                public string city { get; set; }
                public string state { get; set; }
            }
        }
    

    然后:

        var res= JsonConvert.DeserializeObject<phaxioResponse>(json);
        Console.WriteLine(string.Join(",", res.data));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多