【发布时间】:2011-01-31 07:36:42
【问题描述】:
我想毫不费力地将 JSON 中的最终字典转换为 C# 字典。
我在这里使用 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);
这是我的单元测试:
[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"},
]
这是解决它的代码(nb 它看起来很像我最初的尝试):
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);
这只有在你没有其他数组时才有效。
【问题讨论】: