如何在没有静态 key/property 名称的情况下反序列化 JSON
How to deserialize JSON without static key/property names
你好,我在反序列化 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
求解后编辑:
我仍然不知道为什么我的反序列化 class 在这种情况下不起作用(我在许多其他 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;
使用 Newtonsoft.Json,您可以直接反序列化为 Dictionary<string,Dictionary<string,string>>
,例如:
var obj = JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>>(input);
如果你需要它在你的自定义类型中,你应该像这样声明这个类型:
public class WrapperType : Dictionary<string,Dictionary<string,string>>{}
然后反序列化保持不变:
var obj = JsonConvert.DeserializeObject<WrapperType>(input);
请反序列化响应内容
string data = response.Content;
var responseData = client.Deserialize<List<T>>(data);
你好,我在反序列化 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
求解后编辑: 我仍然不知道为什么我的反序列化 class 在这种情况下不起作用(我在许多其他 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;
使用 Newtonsoft.Json,您可以直接反序列化为 Dictionary<string,Dictionary<string,string>>
,例如:
var obj = JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>>(input);
如果你需要它在你的自定义类型中,你应该像这样声明这个类型:
public class WrapperType : Dictionary<string,Dictionary<string,string>>{}
然后反序列化保持不变:
var obj = JsonConvert.DeserializeObject<WrapperType>(input);
请反序列化响应内容
string data = response.Content;
var responseData = client.Deserialize<List<T>>(data);