Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用变量属性名反序列化JSON_C#_Json_Json.net - Fatal编程技术网

C# 使用变量属性名反序列化JSON

C# 使用变量属性名反序列化JSON,c#,json,json.net,C#,Json,Json.net,我想将json从 与此类似: { "BW": { "Neujahrstag": { "datum": "2017-01-01", "hinweis": "" }, "Heilige Drei K\u00f6nige": { "datum": "2017-01-06", "hinweis": "" }, "Gr\u00fcndonnerstag": { "datum": "201

我想将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": ""
    }
}
}

我想反序列化如下:

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; }
}
但由于物业名称不固定,我无法做到这一点


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


有什么办法吗?

如果您将模型修改为:

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; }
}
公共类根目录:字典{}
公共类状态:字典{}
公休假日{
[JsonProperty(PropertyName=“datum”)]
公共日期时间日期{get;set;}
[JsonProperty(PropertyName=“hinweis”)]
公共字符串注释{get;set;}
}
您可以使用以下命令反序列化:

var root = JsonConvert.DeserializeObject<Root>(str);
var firstBwHoliday = root["BW"]?["Neujahrstag"].Date;
var root=JsonConvert.DeserializeObject(str);
var firstBwHoliday=根[“BW”]?[“Neujahrstag”]。日期;

首先更新
假日
以处理属性名称

public class Holiday {
    [JsonProperty("datum")]
    public DateTime Date { get; set; }
    [JsonProperty("hinweis")]
    public string Note { get; set; }
}
接下来要反序列化到嵌套字典

var rawRoot = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Holiday>>>(json);

但是,您确实松开了键,因为它们不是最终模型的一部分。

嵌套的字符串和假日字典“但这对我没有多大帮助。”-详细说明。@AluanHaddad我无法访问属性并从中填充我的结构。@Nkosi遗憾的是
反序列化对象
即使使用嵌套词典也会返回
null
。请注意,原始源代码的日期类似于“0-01-06”,Json.NET将无法解析为
DateTime
var root = new Root {
    States = rawRoot.Select(stateKvp => new State() {
        Holidays = stateKvp.Value.Select(holidayKvp => holidayKvp.Value).ToArray()
    })
    .ToArray()
};