使用JSON.NET在C#中将动态JSON字符串解析为字符串

这是我在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文件中有每个对象约35个属性和8个对象。 总共有大约50种不同的属性。 我搜索了JSON – C# – JSON.NET并阅读了超过15个问题和答案。 对于像我这样的初学者来说,答案有一些有价值的信息,但我无法将答案与我的情况联系起来。 原因如下:

  • 一些答案将json字符串转换为C#对象。 因为我需要对象属性的“名称”,所以这个选项并不能解决我的问题。 我不知道如何在源代码中获取变量的名称并在Windows窗体中使用它。
  • 一些答案将json字符串转换为数据结构。 我并不完全了解字典及其属性,但根据定义,我认为,字典会将2个值相互映射。 在我的例子中,3-5个不同的对象可能具有相同的属性,因此对于一个属性,将有多个值。

除此之外,我见过的一个例子是:

var dict = new JavaScriptSerializer().Deserialize<Dictionary>(json); var postalCode = dict["postalcode"];

由于我有大约50个属性,使用这种方法对我来说不是一个选项:像在本例中一样逐个使用字段名称(“postalcode”是引用问题中示例json对象中的一个属性) 。

乍一看,我以为我可以使用字符串操作自己解析它。 但我想使用漂亮的JSON.NET库。 我有点卡在这里,不知道如何获取json对象的属性名称并在windows窗体中使用它及其值。 我脑子里有一些想法,但不知道如何实现它们。

我可能会将包含8个对象的json字符串解析为一个对象数组,每个对象包含其属性名称和值的2D字符串数组。 然后我会在编辑值时将字符串转换为float。 我需要它们作为字符串,因为我想在Windows窗体中使用它们。 这是我的解决方案。 我该怎么办?

由于你有一个动态的json字符串,我建议将字符串解析为JObject 。 就处理JSON对象树而言,这提供了最大的灵活性:

 var parseTree = JsonConvert.DeserializeObject("{ a: 2, b: \"a string\", c: 1.75 }"); foreach (var prop in parseTree.Properties()) { Console.WriteLine(prop.Name + ": " + prop.Value.ToObject()); } 

另一个JObject示例:

 var parsed = JsonConvert.DeserializeObject("{\"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()); } } 

如果您知道正在处理JSON数组,则可以将其解析为JArray ,然后查看数组中的每个JObject

 var properties = JsonConvert.DeserializeObject("[{a:1}, {b:2, c:3 }]") .SelectMany(o => ((JObject)o).Properties()) .ToArray(); foreach (var prop in properties) { Console.WriteLine(prop.Name + ": " + prop.Value.ToObject()); } 

为了更加灵活,您可以解析为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]); 

这将打印’a’。