2013-07-18 111 views
2

这是我在C#和JSON上的第一个小项目。有人问我解析一个JSON文件到以下几点: 我试图创建一个Windows形式,其体内会含有一个JSON字符串中的格式如下内容:使用JSON.NET将动态JSON字符串解析为C#中的字符串

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 
... 

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

  • 一些答案将JSON字符串转换成C#对象。因为我需要对象属性的“名称”,所以这个选项并不能解决我的问题。我不知道如何在源代码中获取变量的名称并在Windows窗体中使用它。
  • 一些答案将json字符串转换为<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字符串解析为对象数组,每个对象都包含二维字符串数组以获取其属性名称和值。然后在编辑值时将字符串转换为浮点数。我需要它们作为字符串,因为我想在窗体中使用它们。这是我的解决方案。我该如何继续?

回答

6

既然你有一个动态的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

+0

我有一个对象名称作为json字符串开头的字符串,json格式如下:'{\“name \”:{\“a \”:2,\“b \”:\ “一个字符串\”,\“c \”:3}}' 这是否重要?由于我有一个额外的行相比你的JSON字符串,这是否意味着我必须做一些比你的答案更多? 而且这也是整个格式。我在json字符串中没有任何对象。只浮动和一个字符串。 – Varaquilex

+0

@Volkanİlbeyli:我用你给的字符串添加了一个例子。额外的换行符不应该影响解析 – ChaseMedallion

+0

非常感谢。这真的有帮助。 – Varaquilex

1

对于那种动态的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'。