我想将
JSON中的字典最终转换为C#字典,而不是很多.
我在这里使用JSON.NET库咆哮错误的树吗? JArray类不想给我任何东西来访问属性(只有值),即它告诉我值,但从不告诉我“键”.
我不敢相信没有人会发现这种限制,所以假设我错过了什么.我的混乱尝试是这样的:
我在这里使用JSON.NET库咆哮错误的树吗? JArray类不想给我任何东西来访问属性(只有值),即它告诉我值,但从不告诉我“键”.
我不敢相信没有人会发现这种限制,所以假设我错过了什么.我的混乱尝试是这样的:
鉴于这个json:
{ "appSettings" : [ {"rows": "5"},{"columns" : "7"} ] }
我想把它选成这样的字典:
var dict = jsonObject["appSettings"].Select(s => new { key = s.Name,// wish this property existed value = s.Value // wish this property existed }).ToDictionary(s => s.key,s => s.value);
这是我的UnitTest:
[Test] public void CanLoadJsonAppSettings() { var json = @" ""{appSettings"" : [ {""ViewRows"" : ""1""},{""ViewColumns"" : ""2""} ]}"; var dict = CreateJsonDictionary(json); Assert.That(dict.Count,Is.EqualTo(2)); } public CreateJsonDictionary(string jsonText) { var jsonObject = JObject.Parse(jsonText); return jsonObject["appSettings"].Select(s => new { key = s.Name,value = s.Value }).ToDictionary(s => s.key,s => s.value); }
编辑:感谢@jim,我们离得更近了.
为了完整起见,我将记录我需要的稍微尴尬的步骤,以获得我需要的对象:
我不得不改变我的JSON.
我使用了一个更简单/更真实的字典,而不是使用数组(如上面的代码):
var json = @" { ""appSettings"" : { ""ViewRows"" : ""1"",""ViewColumns"" : ""2"" } }";
然后我不得不解析,得到一个JSON JObject,然后转换回一个字符串,然后反序列化:
var jo = JObject.Parse(jsonText); var appSettings = jo["appSettings"]; var appSettings = JsonConvert.DeserializeObject<Dictionary<string,string>>(appSettings.ToString());
所以我的问题的一部分是让JSON感到困惑.
即便如此,如果有一个更优雅的方式来做到这一点,我都是耳朵.
EDIT2:我仍然需要解决上面的原始问题,将JSON数组转换为字典.一旦我的JSON被更正为包含正确的名称/值对:
"connectionStrings": [ {"name" : "string1","value" : "value1"},{"name" : "string2","value" :"value2"},]
var jsonObj = JObject.Parse(jsonText); var conStrings = jsonObj.Properties().Select(s => new { key = s.Name,value = s.Value.ToString() }).ToDictionary(s => s.key,s => s.value);
这只适用于没有其他阵列的情况.
熊猫,
从詹姆斯·纽顿国王自己的问题来看,这是一个类似的问题:
// Json.NET does this... string json = @"{""key1"":""value1"",""key2"":""value2""}"; Dictionary<string,string> values = JsonConvert.DeserializeObject<Dictionary<string,string>>(json);
你可以在这里找到线程:
How can I deserialize JSON to a simple Dictionary<string,string> in ASP.NET?
希望这有所帮助(不是100%肯定如何使用复杂的树结构)