C# 不带属性名的Json.Net反序列化字典
我已经研究了很多其他的问题,但没有找到一个真正适合我的解决方案。我尝试使用JsonExtensionData属性,但这不起作用,因为我无法将其他数据类转换为对象,它会在“NAMESPACE”上抛出无效的扩展数据属性。成员“Sols”类型必须实现IDictionary。错误 我当前的数据模型类如下所示C# 不带属性名的Json.Net反序列化字典,c#,json,.net,.net-core,json.net,C#,Json,.net,.net Core,Json.net,我已经研究了很多其他的问题,但没有找到一个真正适合我的解决方案。我尝试使用JsonExtensionData属性,但这不起作用,因为我无法将其他数据类转换为对象,它会在“NAMESPACE”上抛出无效的扩展数据属性。成员“Sols”类型必须实现IDictionary。错误 我当前的数据模型类如下所示 public partial class Mars { public Dictionary<string, Sol> Sols { get; set; } [JsonP
public partial class Mars
{
public Dictionary<string, Sol> Sols { get; set; }
[JsonProperty("sol_keys")]
public List<long> SolKeys { get; set; }
}
public partial class Sol
{
[JsonProperty("AT")]
public At At { get; set; }
[JsonProperty("First_UTC")]
public DateTimeOffset FirstUtc { get; set; }
[JsonProperty("Last_UTC")]
public DateTimeOffset LastUtc { get; set; }
[JsonProperty("Season")]
public string Season { get; set; }
}
public partial class At
{
[JsonProperty("av")]
public double Av { get; set; }
[JsonProperty("ct")]
public long Ct { get; set; }
[JsonProperty("mn")]
public double Mn { get; set; }
[JsonProperty("mx")]
public double Mx { get; set; }
}
{
"651":
{
"AT":
{
"av": -61.957,
"ct": 302204,
"mn": -96.733,
"mx": -15.877
},
"First_UTC": "2020-09-25T02:42:14Z",
"Last_UTC": "2020-09-26T03:21:49Z",
"Season": "summer"
},
"652": {
"AT": {
"av": -65.002,
"ct": 278608,
"mn": -96.111,
"mx": -15.653
},
"First_UTC": "2020-09-26T03:21:50Z",
"Last_UTC": "2020-09-27T04:01:24Z",
"Season": "summer"
},
"sol_keys": [
"646",
"647",
"648",
"649",
"650",
"651",
"652"
]
}
我无法真正修改json数据,因为我是从api获取的。
我基本上只想选择一个数字,然后得到该对象的Sol数据
任何帮助都将不胜感激。JSON不适合C类型系统。但是,您仍然可以使用Json.Net来解析它。你只需要介绍一些额外的步骤 第一步是将JSON解析为JObject: 现在有点棘手了。如果从JSON中删除sol_键(在本例中为已解析的JSON),则它具有可以解析的sol对象字典的结构:
jObject.Remove("sol_keys");
var mars = jObject.ToObject<Dictionary<long, Sol>>();
现在您已经从JSON解析了solKeys和mars。此外,solKeys和字典中的key共享相同的long类型。正是我想要的。是的,api提供的json非常奇怪。如果你想知道它是从美国宇航局的官方api
var solKeys = jObject.GetValue("sol_keys").ToObject<long[]>();
jObject.Remove("sol_keys");
var mars = jObject.ToObject<Dictionary<long, Sol>>();