使用可变属性名称反序列化 JSON

Fel*_* D. 6 c# json json.net

我想从这里反序列化 json。

与此类似:

{
"BW": {
    "Neujahrstag": {
        "datum": "2017-01-01",
        "hinweis": ""
    },
    "Heilige Drei K\u00f6nige": {
        "datum": "2017-01-06",
        "hinweis": ""
    },
    "Gr\u00fcndonnerstag": {
        "datum": "2017-04-13",
        "hinweis": "Gem\u00e4\u00df \u00a7 4 Abs. 3 des Feiertagsgesetzes von Baden-W\u00fcrttemberg[10] haben Sch\u00fcler am Gr\u00fcndonnerstag und am Reformationstag schulfrei. In der Regel legt das Kultusministerium die Ferientermine so fest, dass diese beiden Tage in die Osterferien bzw. in die Herbstferien fallen."
    },
    "Karfreitag": {
        "datum": "2017-04-14",
        "hinweis": ""
    }
},
"BY": {
    "Neujahrstag": {
        "datum": "2017-01-01",
        "hinweis": ""
    },
    "Heilige Drei K\u00f6nige": {
        "datum": "2017-01-06",
        "hinweis": ""
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我想反序列化为:

public class Root
{
    public State[] States { get; set; }
}

public class State
{        
    public Holiday[] Holidays { get; set; }
}

public class Holiday
{
    public DateTime Date { get; set; }
    public string Note { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但由于属性名称不固定,我无法执行此操作。

我也尝试过使用 JObject.Parse() 但这对我没有多大帮助。

关于如何做到这一点有什么想法吗?

小智 9

如果您将模型修改为:

public class Root : Dictionary<string, State> { }

public class State : Dictionary<string, Holiday> { }

public class Holiday {
    [JsonProperty(PropertyName = "datum")]
    public DateTime Date { get; set; }

    [JsonProperty(PropertyName = "hinweis")]
    public string Note { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法反序列化:

var root = JsonConvert.DeserializeObject<Root>(str);
var firstBwHoliday = root["BW"]?["Neujahrstag"].Date;
Run Code Online (Sandbox Code Playgroud)