为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
喵喵时光机 2022-10-23 16:00:51
我有以下 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);        }    }}
查看完整描述

1 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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

在 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


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号