2

这是我第一个关于 C# 和 JSON 的小项目。我被要求将 JSON 文件解析为以下内容:我正在尝试创建一个 Windows 窗体,其正文将包含以下格式的 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 字符串转换为<Dictionary>数据结构。我并不完全了解字典及其属性,但根据定义,我认为字典将 2 个值相互映射。就我而言,3-5 个不同的对象可能具有相同的属性,因此对于一个属性将有多个值。

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

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

由于我有大约 50 个属性,因此使用这种方法对我来说不是一个选项: 像在此示例中所做的那样逐个使用字段名称(“邮政编码”是引用问题中示例 json 对象中的属性之一) .

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

我可能会将包含 8 个对象的 json 字符串解析为一个对象数组,每个对象都包含 2D 字符串数组来表示它们的属性名称和值。然后我将在编辑值时将字符串转换为浮点数。我需要它们作为字符串,因为我想在 Windows 窗体中使用它们。这是我心中的解决方案。我该如何进行?

4

2 回答 2

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.

于 2013-07-18T11:26:18.560 回答
2

对于这种动态 JSON,您可能需要考虑比 JSON.NET 更简单的东西,例如 SimpleJson ( https://github.com/facebook-csharp-sdk/simple-json )。它只是您在项目中复制/粘贴或通过 NuGet 安装的 .cs 文件。

它支持“动态”并且非常易于使用。

例如,如果您有一个 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'。

于 2013-07-18T13:05:40.967 回答