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