使用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个问题和解答。 对于像我这样的初学者来说,答案有一些有价值的信息,但我无法将答案与我的情况联系起来。 这是原因:

  • 一些答案将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字符串解析为对象数组,每个对象都包含二维字符串数组以获取其属性名称和值。 然后在编辑值时将字符串转换为浮点数。 我需要它们作为字符串,因为我想在窗体中使用它们。 这是我的解决方案。 我该如何继续?


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

    下一篇: Json.Net parsing datetime value error