我想将JSON中的字典最终转换为C#字典,而不是很多.
我在这里使用JSON.NET库咆哮错误的树吗?JArray类不想给我任何东西来访问属性(只有值),即它告诉我值,但从不告诉我"键".
我不敢相信没有人会发现这种限制,所以假设我错过了什么.我的混乱尝试是这样的:
鉴于这个json:
{
"appSettings" : [
{"rows": "5"},
{"columns" : "7"}
]
}
Run Code Online (Sandbox Code Playgroud)
我想把它选成这样的字典:
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);
Run Code Online (Sandbox Code Playgroud)
这是我的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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:感谢@jim,我们离得更近了.为了完整起见,我将记录我需要的稍微尴尬的步骤,以获得我需要的对象:
我不得不改变我的JSON.我使用了一个更简单/更真实的字典,而不是使用数组(如上面的代码):
var json = @"
{
""appSettings"" : {
""ViewRows"" : ""1"",
""ViewColumns"" : ""2""
}
}";
Run Code Online (Sandbox Code Playgroud)
然后我不得不解析,得到一个JSON JObject,然后转换回一个字符串,然后反序列化:
var jo = JObject.Parse(jsonText);
var appSettings = jo["appSettings"];
var appSettings = JsonConvert.DeserializeObject<Dictionary<string, string>>(appSettings.ToString());
Run Code Online (Sandbox Code Playgroud)
所以我的问题的一部分是让JSON感到困惑.即便如此,如果有一个更优雅的方式来做到这一点,我都是耳朵.
EDIT2:我仍然需要解决上面的原始问题,将JSON数组转换为字典.一旦我的JSON被更正为包含正确的名称/值对:
"connectionStrings": [
{"name" : "string1", "value" : "value1"},
{"name" : "string2", "value" :"value2"},
]
Run Code Online (Sandbox Code Playgroud)
这是解决它的代码(它看起来很像我原来的尝试):
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);
Run Code Online (Sandbox Code Playgroud)
这只适用于没有其他阵列的情况.
jim*_*lan 11
熊猫,
从詹姆斯·纽顿国王自己的问题来看,这是一个类似的问题:
// Json.NET does this...
string json = @"{""key1"":""value1"",""key2"":""value2""}";
Dictionary<string, string> values
= JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到线程:
如何在ASP.NET中将JSON反序列化为简单的Dictionary <string,string>?
希望这有所帮助(不是100%肯定如何使用复杂的树结构)
我知道这不是直接回答您的问题的正确答案,但对于 C# 中的所有 JSON 内容,这里是一个非常好的库的链接,您可以使用它轻松地在 C# 中使用 JSON 执行任何操作。
http://james.newtonking.com/pages/json-net.aspx