gpt4 book ai didi

c# - 有没有更优雅的方法使用 system.text.json 从 JSON 对象获取特定值

转载 作者:行者123 更新时间:2023-12-02 19:25:41 26 4
gpt4 key购买 nike

考虑这个 Json 对象:

{
"main": {
"2058": {
"id": "2058",
"name": "foo",
"attrib1": "17",
"domain": "somewhere.net",
"enabled": "1",
"permissions": [
"admin",
"user",
"guest",
"vpn",
"power"
]
}
},
"validate": {
"2058": {
"id": "2058",
"name": "foo",
"attrib1": "17",
"domain": "somewhere.net",
"enabled": "1",
"permissions": [
"admin",
"user",
"guest",
"vpn",
"power"
]
}
},
"result": "ok"
}

在“启用”和“权限”之间,我还遗漏了数百对。 “验证”部分是“主要”的精确副本,“结果”是,嗯,结果。

我想从主要部分获取 2 个特定值。 “id”和“域”。我使用以下代码来执行此操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;

namespace JsonParse
{
class Program
{
static void Main()
{
string json = "{" +
"\"main\":{" +
"\"2058\":{" +
"\"id\":\"2058\"," +
"\"name\":\"foo\"," +
"\"attrib1\":\"17\"," +
"\"domain\":\"somewhere.net\"," +
"\"enabled\":\"1\"," +
"\"permissions\":[\"admin\",\"user\",\"guest\",\"vpn\",\"power\"]" +
"}" +
"}," +
"\"validate\":{" +
"\"2058\":{" +
"\"id\":\"2058\"," +
"\"name\":\"foo\"," +
"\"attrib1\":\"17\"," +
"\"domain\":\"somewhere.net\"," +
"\"enabled\":\"1\"," +
"\"permissions\":[\"admin\",\"user\",\"guest\",\"vpn\",\"power\"]" +
"}" +
"}," +
"\"result\":\"ok\"" +
"}";

foreach (KeyValuePair<string, object> item in JsonSerializer.Deserialize<Dictionary<string, object>>(json))
{
if (item.Key == "main")
{
Dictionary<string, object> pairs = JsonSerializer.Deserialize<Dictionary<string, object>>(item.Value.ToString());
Dictionary<string, object> pairs1 = JsonSerializer.Deserialize<Dictionary<string, object>>(pairs.First().Value.ToString());
foreach (KeyValuePair<string, object> valuePair in pairs1)
{
if (valuePair.Key == "id" || valuePair.Key == "domain")
{
Console.WriteLine("Key: " + valuePair.Key + "\nValue: " + valuePair.Value);
}
}
}
}
}
}
}

由此,我得到“2058”和“somewhere.net”,但是有没有更优雅的方法来获取值而不是反序列化 3 次?

最佳答案

如果您使用 System.Text.Json API,您可以将 JSON 解析为 JsonDocument首先,然后枚举其属性。首先获取 main 对象,然后展平其子属性并通过 iddomain 名称查找所需值

using var document = JsonDocument.Parse(jsonString);

var main = document.RootElement.EnumerateObject().FirstOrDefault(p => p.Name == "main");
var properties = main.Value.EnumerateObject().SelectMany(p => p.Value.EnumerateObject()).ToList();
var id = properties.FirstOrDefault(p => p.Name == "id").Value.GetString();
var domain = properties.FirstOrDefault(p => p.Name == "domain").Value.GetString();

关于c# - 有没有更优雅的方法使用 system.text.json 从 JSON 对象获取特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62429809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com