【问题标题】:How to get a value from JSON object with approximate key如何使用近似键从 JSON 对象中获取值
【发布时间】:2023-02-06 20:56:44
【问题描述】:

我在服务地图下有以下 JSON 文件,键值不固定

"ServiceMap": {
    "rackAC1": {
        "Env": "Public",
        "Center": "north"
    },
    "rackD1": {
        "Env": "Public",
        "Center": "south"
    },
    "rackD2": {
        "Env": "Public",
        "Center": "North-south"
    },
    "rackD3": {
        "Env": "Public",
        "Center": "south"
    },
    ...,
    "rackD1000": {
        "Env": "Public",
        "Center": "south"
    },
    "rackBO": {
        "Env": "Public",
        "Center": "East"
    },
    "rackB1": {
        "Env": "Public",
        "Center": "West"
    }
}

我想使用 linq 从 rackD1 提取键值到中心在南的 rackD1000。 是否可以提取像 JsonContent["serviceMap"][rackD1*] 这样的键值

【问题讨论】:

  • 您使用的是什么 JSON 库?默认System.Text.JsonNewtonsoft.Json
  • 请使用适当的缩进格式化您的 JSON,以便我们更容易阅读。
  • rackAC1 等是字典的字符串键。它会更容易访问。
  • 这回答了你的问题了吗? Deserializing JSON with dynamic keys

标签: c# json


【解决方案1】:

只需将其反序列化为正确的类结构并对结果使用 LINQ。

public class Root
{
    // use dictionary to represent dynamic property names
    public Dictionary<string, ServiceMap> ServiceMap { get; set; } 
}

public class ServiceMap
{
    public string Env { get; set; } // can be excluded if not needed
    public string Center { get; set; }
}

并过滤结果:

var root = ... ; // deserialized root
var result = root.ServiceMap
   .Where(kvp => kvp.Value.Center == "south") // or kvp.Value.Center.Equals("south", StringComparison.InvariantCultureIgnoreCase) for case-insensitive
   .Select(kvp => kvp.Key) // keys like "rackD1", ...
   .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2021-03-04
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多