当前位置: 首页 > 面试题库 >

如何从JSON字符串获取深度嵌套的属性?

殷永嘉
2023-03-14
问题内容

如何使用JSON.NET从JSON中获取“ myThings”数组,如下所示?

范例1:

{
    "z": {
        "a": 1,
        "b": 2
    },
    "something": {
        "y": [1, 2],
        "somethingElse": {
            "1234": {
                "foo": "bar",
                "myThings": [{
                    "name": "bob",
                    "age": 3
                }, {
                    "name": "bob",
                    "age": 3
                }]
            }
        }
    }
}

范例2:

{
    "z": {
        "a": 1,
        "b": 2
    },
    "something": {
        "y": [1, 2],
        "somethingElse": {
            "7890": {
                "foo": "bar"
            }
        }
    }
}

我遇到的一些困难:

  • 属性名称之一是不可预测的数字(“ 1234”和“ 7890”)
  • 有时“ myThings”数组不存在-在这种情况下,我想要的是null或空数组/集合

可以帮助您的另一个考虑因素:我确实有一个静态类来表示myThings数组中的内容,所以我的理想返回值是 IEnumerable<MyThing>

我的第一个尝试是使用,JsonConvert.DeserializeObject<dynamic>(json)但是我不知道如何处理上面提到的问题。最后,我不需要整个JSON字符串的全部数据,只需要一个名为“
myThings”的数组即可。


问题答案:

您可以JToken.SelectTokens()用于此目的。它允许使用通配符查询JSON和使用JSONPath语法进行递归搜索:

var root = JToken.Parse(json);
var myThings = root.SelectTokens("..myThings[*]").ToList();

".."递归下降 运算符"myThings[*]"表示返回属性的所有数组项"myThings"

原型小提琴。

如果的数组条目"myThings[*]"对应于某个POCO
MyThing,则可以JToken.ToObject<T>()在查询后使用反序列化它们:

    var myThings = root.SelectTokens("..myThings[*]").Select(t => t.ToObject<MyThing>()).ToList();


 类似资料:
  • 问题内容: 我试图找到一种从的有效载荷中解析嵌套属性的干净方法。 这是有效负载的粗略概括: 我的目标是拥有具有和字段的对象数组。 有人知道干净地解析此内容的好方法吗? 现在,我正在尝试创建一个类,并在其中创建一个用于数据,值,用户等的静态内部类。 我用来呼叫端点。 问题答案: 您需要使用JsonPath库,该库仅允许您选择必填字段,然后可以将原始数据转换为类。解决方案示例如下所示: 上面的代码打印

  • 我正在从Spark读取一个dynamodb表,这个表在一个字段中有一个JSON字符串,在其他字段中有字符串。我能够读取JSON字段,但不能读取嵌套的JSON字段。这不是使用dataframes的查询Json列的副本。这个问题解释了如何从JSON字符串中提取列,但没有解释嵌套的JSON列。 users.show(1) 示例数据集 我需要从col1(JSON结构)和ID字段中提取几个字段。我能够理解如

  • 问题内容: 我正在尝试从深度嵌套的JSON字符串创建单个Pandas DataFrame对象。 JSON模式是: 期望的结果 我需要将其展平以产生一张桌子: 第一列是值,其余列是键的值并存储在列表中。 到目前为止,我已经 是一个列表,其中长度等于个人数量,即。df对象只是返回 如何遍历该列表以获取dict值并创建N个不同的列?我应该尝试为该列表创建一个DataFrame ,重塑它的形状,然后用角色

  • 问题内容: 解决方案 :这是我的错误。 正确的方法是 response.body()。string() 而不是 response.body.toString() 我正在使用Jetty servlet,URL是,每次请求此URL都会返回 当在浏览器中键入url时,它会显示出来,不幸的是,当我使用时,它会显示除json字符串以外的其他内存地址。 Okhttp代码Im使用: 有人可以帮忙吗? 问题答案:

  • 位置值是从我们的服务器获取的,以字符串格式,现在我定义了新的位置,之后我想获取经度和纬度,但它是0.0。代码是这样的。

  • 问题内容: 我正在用Go编写一个websocket客户端。我正在从服务器接收以下JSON: 我正在尝试访问该参数,但无法掌握如何深入了解接口类型: 显然是错误的,因为这种表示法是不正确的: 我只是找不到一种方法来挖掘地图以获取深层嵌套的键和值。 一旦可以克服动态值,我便想声明这些消息。我将如何编写类型结构来表示这种复杂的数据结构? 问题答案: 您解码成的部分将与该字段的类型匹配。因此,在这种情况下