使用JSON.NET将动态JSON字符串解析为C#中的字符串
这是我在C#和JSON上的第一个小项目。 我被要求将JSON文件解析为以下内容:我试图创建一个窗体窗体,其主体将以下列格式包含JSON字符串的内容:
Name of the object
(Label) name of the attribute of the object - (TextBox) editable value
(Label) name of the attribute of the object - (TextBox) editable value
...
我在json文件和8个对象中有大约35个属性。 总共有大约50种不同的属性。 我搜索了JSON - C# - JSON.NET并阅读了超过15个问题和解答。 对于像我这样的初学者来说,答案有一些有价值的信息,但我无法将答案与我的情况联系起来。 这是原因:
<Dictionary>
数据结构。 我没有完全意识到字典及其属性,但根据定义,我认为,字典将两个值相互映射。 就我而言,3-5个不同的对象可能具有相同的属性,因此对于一个属性会有多个值。 除此之外,我见过的一个例子是:
var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(json); var postalCode = dict["postalcode"];
因为我有大约50个属性,所以使用这种方法对我来说不是一个选择:像这样在本例中使用字段名称(“postalcode”是引用问题中示例json对象中的一个属性) 。
乍看之下,我想我可以使用字符串操作自己解析它。 但我想使用美丽的JSON.NET库。 我有点卡在这里,不知道如何获取json对象的属性名称,并在windows窗体中使用它的值。 我脑海中有一些想法,但不知道如何实施它们。
我可能会将包含8个对象的json字符串解析为对象数组,每个对象都包含二维字符串数组以获取其属性名称和值。 然后在编辑值时将字符串转换为浮点数。 我需要它们作为字符串,因为我想在窗体中使用它们。 这是我的解决方案。 我该如何继续?
既然你有一个动态的json字符串,我建议将该字符串解析为一个JObject
。 这为处理JSON对象树提供了最大的灵活性:
var parseTree = JsonConvert.DeserializeObject<JObject>("{ a: 2, b: "a string", c: 1.75 }");
foreach (var prop in parseTree.Properties()) {
Console.WriteLine(prop.Name + ": " + prop.Value.ToObject<object>());
}
另一个JObject
示例:
var parsed = JsonConvert.DeserializeObject<JObject>("{"name":{"a":2, "b":"a string", "c":3 } }");
foreach (var property in parsed.Properties()) {
Console.WriteLine(property.Name);
foreach (var innerProperty in ((JObject)property.Value).Properties()) {
Console.WriteLine("t{0}: {1}", innerProperty.Name, innerProperty.Value.ToObject<object>());
}
}
如果您知道自己正在处理JSON数组,则可以改为解析为JArray
,然后查看数组中的每个JObject
:
var properties = JsonConvert.DeserializeObject<JArray>("[{a:1}, {b:2, c:3 }]")
.SelectMany(o => ((JObject)o).Properties())
.ToArray();
foreach (var prop in properties) {
Console.WriteLine(prop.Name + ": " + prop.Value.ToObject<object>());
}
为了更灵活,您可以解析为JToken
。
对于那种动态的JSON,你可能想要考虑一些比JSON.NET更麻烦的东西,比如SimpleJson(https://github.com/facebook-csharp-sdk/simple-json)。 它只是一个.cs文件,可以复制/粘贴到您的项目中,也可以通过NuGet进行安装。
它支持“动态”,非常易于使用。
例如,如果您有JSON,例如:
{
"inputs" : ["a", "b", "c"],
"outputs" : ["c", "d", "e"]
}
你可以解析它:
dynamic sys = SimpleJson.DeserializeObject(jsonString);
然后立即访问所有内容:
foreach(var attr in sys) {
foreach( var name in attr ) {
Console.WriteLine("In {0} with name: {1}", attr, name);
}
}
您当然也可以通过名称或索引访问:
Console.WriteLine(sys["inputs"][0]);
这将打印'一个'。
链接地址: http://www.djcxy.com/p/20081.html上一篇: Parsing dynamic JSON string into string in C# using JSON.NET