【问题标题】:Get Property Name from JSON从 JSON 获取属性名称
【发布时间】:2020-03-24 20:38:54
【问题描述】:

我想像这样使用 System.Text.Json 解析 JSON 对象:

[{
    "success": {
        "/a/b/c": false
    }
}]

我想知道第一个属性是否被命名,例如成功或错误,代码如下:

using (var document = JsonDocument.Parse(test))
{
  var root = document.RootElement;
  var success = root.EnumerateArray().Current;
  Console.WriteLine(success);
}

但不知何故,我无法获得成功属性,最重要的是它的名称。

【问题讨论】:

标签: c# json system.text.json


【解决方案1】:

您的 JSON 是一个对象数组,因此要获取数组中第一个条目中第一个属性的名称,您可以像这样组合 EnumerateArray() 和 EnumerateObject():

using var document = JsonDocument.Parse(test);

var names = document.RootElement
    .EnumerateArray()
    .SelectMany(o => o.EnumerateObject())
    .Select(p => p.Name);

var firstName = names.FirstOrDefault();

话虽如此,JSON standard 将对象定义为 一组无序的名称/值对,因此您可能不想硬编码代码以仅检查第一个属性。以下代码检查第一个对象是否具有所需名称的 any 属性:

var propertyName = "success";

using var document = JsonDocument.Parse(test);

var hasProperty = document.RootElement
    .EnumerateArray()
    .Take(1) // Just the first object
    .Any(o => o.EnumerateObject().Any(p => p.Name == propertyName));

如果要检查数组中的任何对象是否具有所需的属性,请删除.Take(1)。

演示小提琴here.

【讨论】:

    【解决方案2】:

    也许这有帮助

    你必须移动那个枚举器,(你必须移动那个颜色 teehveeeeeyyy....)

    class Program
    {
        static void Main(string[] args)
        {
            string json = "[{\"success\": {\"/a/b/c\": false}}]";
            using (var document = JsonDocument.Parse(json))
            {
                var root = document.RootElement;
                var enumerator = root.EnumerateArray();
                while (enumerator.MoveNext())
                {
                    Console.WriteLine($"You are now at array element {enumerator.Current}");
    
                    var elementContentEnumerator = enumerator.Current.EnumerateObject();
                    while (elementContentEnumerator.MoveNext())
                    {
                        Console.WriteLine($"You are now at property {elementContentEnumerator.Current.Name}");
                    }
    
                }
                Console.ReadLine();
            }
        }
    }
    

    另外:通过 JSONS 手动解析时需要考虑的事项

    有很多功能强大的 JSON 框架可用于 C#。并且有很多可用的东西,可以使代码更流畅。尤其是 LINQ,它的意思是语言集成查询。试一试。 其中大部分使使用 JSONS 和 C# 非常方便,等等。

    所以通常情况下(除非这是一件非常特殊的事情),您可以说,每当您手动解析 JSON 并手动循环遍历枚举器时,就像在上面的代码中一样,您可能没有利用C# 及其库的全部功能。

    如果有帮助,请接受作为答案,

    你好,迈克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多