从JSON中获取属性名称

3
我想要使用System.Text.Json解析这样的JSON对象:
[{
    "success": {
        "/a/b/c": false
    }
}]

我想通过以下代码确定第一个属性是否命名为“success”或“error”:
```html

我想通过以下代码确定第一个属性是否命名为“success”或“error”:

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

但是我无论如何都无法获取到成功属性,最重要的是它的名称。


1
这个答案中有一个枚举任何对象属性的示例,用于将newtonsoft代码转换为.net core 3中的System.Text.Json。JObject.Parse和JsonProperty的等效物是什么? - dbc
2个回答

4
你的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标准将对象定义为具有无序名称/值对的集合,因此您可能不想硬编码您的代码以仅检查第一个属性。以下代码检查第一个对象是否具有所需名称的任何属性:
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)
演示程序见此处

谢谢你的发布,过渡有点痛苦。 - ganjeii

0

或许这可以帮助到你

你需要移动那个枚举器,(你需要移动那个颜色调制器......)

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();
        }
    }
}

另外:手动解析JSON时需要考虑的事项

C#有很多强大的JSON框架可用,还有很多可用的东西,可以使代码更加流畅。特别是LINQ,即语言集成查询。试试吧。 这些大多数使得使用JSONS和C#非常方便等。

因此,通常情况下(除非你正在处理非常特殊的事情),当你手动解析JSON并手动循环枚举器时,就可能没有充分利用C#及其库的全部功能。

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

问候,Mike


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接