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

C# 从父对象名称不固定的JSON字符串访问属性,c#,json,json.net,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" } } 如果

我有以下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);
        }
    }
}

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

查找JSON中某个属性的最短方法是将JSON解析为,然后与递归下降一起使用:

小提琴:

据我所知,使用Json.Net执行相同操作的最快方法是使用:


小提琴:

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

查找JSON中某个属性的最短方法是将JSON解析为,然后与递归下降一起使用:

小提琴:

据我所知,使用Json.Net执行相同操作的最快方法是使用:


Fiddle:

这是什么语言…?C#与Newtonsoft Json库(我们希望减少这一时间)-什么花费了时间?你的问题根本不能解释这一点,所以我们只能猜测你的问题是什么。问题中显示的JSON应该能够非常快速地解析。正如我提到的,该对象将具有许多属性(从100到1000不等)。我唯一的问题是,除了问题中提到的方法之外,我们还有其他方法吗?这是什么语言…?C#与Newtonsoft Json库(我们希望减少这一时间)-什么花费了时间?你的问题根本不能解释这一点,所以我们只能猜测你的问题是什么。问题中显示的JSON应该能够非常快速地解析。正如我提到的,该对象将具有许多属性(从100到1000不等)。我唯一的问题是,除了问题中提到的方法之外,我们还有其他方法吗?这太棒了。。非常感谢你。。。我将尝试我的目标并决定方法。这太棒了。。非常感谢你。。。我将尝试我的目标并决定方法。
public static string FindFirst(string json, string propertyName)
{
    return JObject.Parse(json).SelectToken("$.." + propertyName)?.ToString();
}
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;
    }
}