c# - 从父对象名称不固定的 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);
}
}
}
解决方案
根据您对“最佳”的定义:
在 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;
}
}
推荐阅读
- networking - 了解 TCP/UDP 客户端端口分配
- ios - 为什么 UIGraphicsGetCurrentContext 在 UIGraphicsBeginImageContext 之后返回 nil
- javascript - 剑道编辑器:更改事件仅触发一次
- r - USarrests data frame to tibble with scaling in R
- node.js - TypeError:BrowserWindow 不是构造函数
- linux - 为每个通配符匹配创建命令替换
- c - C冲突类型错误而实际上没有冲突类型?
- c - 如何使用从 C 中的文件读取的数据创建链表
- kubernetes - k8s api-server - 提供用户账号授权
- python - Python Tkinter 如何在 txt 文档中编辑脚本的变量?