【问题标题】:How to deserialize JSON without static key/property names如何在没有静态键/属性名称的情况下反序列化 JSON
【发布时间】:2019-07-18 05:38:06
【问题描述】:

您好,我在反序列化 IRestResponse.Content JSON 响应时遇到问题。

{
"49": 
    {
        "9345": "2018-10-11", 
        "106": null, 
        "107": "4222238842", 
        "108": "CompanyName", 
        "8210": "2018-11-11/1", 
        "110": "00-300", 
        "109": "Street", 
        "112": "Country", 
        "18418": null, 
        "18420": "S\u0141ON", 
        "18422": "OtherString", 
        "9338": null, 
        "111": "City"
    }
}

我尝试了一些网页或内置 VisualStudio 转换器,但它给了我这样的东西。

public class Rootobject
{
    public _49 _49 { get; set; }
}

public class _49
{
    public string _9345 { get; set; }
    public object _106 { get; set; }
    public string _107 { get; set; }
    public string _108 { get; set; }
    public string _8210 { get; set; }
    public string _110 { get; set; }
    public string _109 { get; set; }
    public string _112 { get; set; }
    public object _18418 { get; set; }
    public string _18420 { get; set; }
    public string _18422 { get; set; }
    public object _9338 { get; set; }
    public string _111 { get; set; }
}

这看起来没问题,但在我的情况下,这些 JSON 文件具有动态属性名称,并且可以具有另一个“int”值。 “49”内的嵌套内容也可以有更少或更多的值。 我对收集“49”

我也尝试过类似的方法,但也不起作用:

public class DeserializeJsonContent
{
   public Dictionary<object, Dictionary<object, object>> values { get; set; }
}

简化代码示例

    public List<T> JSONDeserialize<T>(IRestResponse response) where T : new()
    {
        var responseData = client.Deserialize<List<T>>(response);
        var ListDeserializedData = responseData.Data.ToList<T>();
        return ListDeserializedData;
    }

....

var response = rest.client.Execute(request);
if (response.IsSuccessful)
{
    var obj = rest.JSONDeserialize<DeserializeJsonContent>(response);
}

obj 计数为 1 但 vals = null

求解后编辑: 我仍然不知道为什么我的反序列化类在这种情况下不起作用(我在许多其他 json 反序列化响应中使用它) 感谢 xdtTransform 的回答,我已经尝试过并且所有这些都有效

var obj2 = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<object, object>>>(response.Content);
var obj3 = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(response.Content);
var obj4 = JsonConvert.DeserializeObject<Dictionary<int, Dictionary<string, string>>>(response.Content);
var obj5 = JsonConvert.DeserializeObject<Dictionary<object, Dictionary<string, string>>>(response.Content);
var obj6 = JsonConvert.DeserializeObject<Dictionary<object, Dictionary<object, object>>>(response.Content);
var obj7 = JsonConvert.DeserializeObject<Dictionary<object, Dictionary<int, object>>>(response.Content);

那么就

var value = obj2.First().Key;

【问题讨论】:

  • 字典方法是正确的。你实际上是如何使用它的?
  • 如果你能分享minimal reproducible exampleDictionary 方法,那就太棒了。
  • @cricket_007 我将嵌套字典更改为字符串,对象但仍然不起作用,还添加了一些代码示例
  • 您不需要单独的课程。仅用字典替换 DeserializeJsonContent

标签: c# json rest restsharp


【解决方案1】:

使用Newtonsoft.Json,可以直接反序列化为Dictionary&lt;string,Dictionary&lt;string,string&gt;&gt;like:

var obj = JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>>(input);

如果你需要它在你的自定义类型中,你应该像这样声明这个类型:

public class WrapperType : Dictionary<string,Dictionary<string,string>>{}

然后反序列化保持不变:

 var obj = JsonConvert.DeserializeObject<WrapperType>(input);

Updated demo

【讨论】:

  • 谢谢!通过第一个代码示例,我解决了我的问题,还在底部编辑了问题。现在将尝试使用 WrapperType :) 祝你有美好的一天!
【解决方案2】:

请反序列化响应内容

string data = response.Content;

var responseData = client.Deserialize<List<T>>(data);

【讨论】:

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