首页 > 解决方案 > 从父对象名称不固定的 JSON 字符串访问属性

问题描述

我有以下 JSON 字符串,我需要从中访问名为“Mode”的属性值:

{
  "CommomData": {
    "DateTime": {
      "Year": 2019,
      "Month": 3,
      "Day": 11,
      "Hour": 14,
      "Min": 1,
      "Second": 29
    }
  },
  "Status": {
    "Mode": "Test",
    "Loc": "Test"
  }
}

如果您在此处记下“Mode”的父属性名称,这里是“Status”,但这可能会更改为“LatestStatus”或“FirstStatus”或任何其他值。

目前,我已经编写了下面的代码,它工作正常,但操作大约需要 60 到 150 毫秒(我们希望减少这个时间)。请注意,该对象有更多属性,但我只发布了一些来解释这个问题。

在不知道对象类型和父属性名称的情况下,是否有任何其他最佳方法可以从 JSON 字符串中获取值?

JObject payloadJObject = JObject.Parse(payload);

foreach (var item in payloadJObject)
{
    foreach (JProperty subitem in item.Value.ToList())
    {
        if (subitem.Name == "Mode")
        {
            return Convert.ToString(subitem.Value);
        }
    }
}

标签: c#jsonjson.net

解决方案


根据您对“最佳”的定义:

在 JSON 中某处查找属性的最短方法是将 JSON 解析为 a JObject,然后SelectToken与递归下降JsonPath 表达式一起使用:

public static string FindFirst(string json, string propertyName)
{
    return JObject.Parse(json).SelectToken("$.." + propertyName)?.ToString();
}

小提琴:https ://dotnetfiddle.net/JQxu9c

我知道用 Json.Net 做同样事情的最快JsonTextReader方法是使用:

public static string FindFirst(string json, string propertyName)
{
    using (StringReader sr = new StringReader(json))
    using (JsonReader reader = new JsonTextReader(sr))
    {
        while (reader.Read())
        {
            if (reader.TokenType == JsonToken.PropertyName && 
                reader.Value.ToString() == propertyName)
            {
                return reader.ReadAsString();
            }
        }
        return null;
    }
}

小提琴:https ://dotnetfiddle.net/aR3qVe


推荐阅读