C# 不带属性名的Json.Net反序列化字典

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

我已经研究了很多其他的问题,但没有找到一个真正适合我的解决方案。我尝试使用JsonExtensionData属性,但这不起作用,因为我无法将其他数据类转换为对象,它会在“NAMESPACE”上抛出无效的扩展数据属性。成员“Sols”类型必须实现IDictionary。错误

我当前的数据模型类如下所示

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>>();