父对象名称不固定的JSON字符串的访问属性

时间:2019-03-13 13:15:01

标签: c# json json.net

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

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

如果您在此处注明“模式”的父属性名称,则为“状态”,但这可以更改为“ 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);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

取决于您对“最佳”的定义:

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

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