zoukankan      html  css  js  c++  java
  • 使用JSONPath

    SONPath是查询JSON对象元素的标准方法。JSONPath使用路径表达式来导航JSON文档中的元素,嵌套元素和数组。有关JSON的更多信息,请参阅JSON简介

    使用JSONPath访问JSON元素

    接下来,您可以找到如何使用JSONPath表达式访问JSON格式数据中的各种元素。对于本节中的示例,假设源流包含以下格式的JSON记录。

     
    {
      "customerName":"John Doe",
      "address":
      {
        "streetAddress":
        [
          "number":"123",
          "street":"AnyStreet"
        ],
        "city":"Anytown"
      }
      "orders":
      [
        { "orderId":"23284", "itemName":"Widget", "itemPrice":"33.99" },
        { "orderId":"63122", "itemName":"Gadget", "itemPrice":"22.50" },
        { "orderId":"77284", "itemName":"Sprocket", "itemPrice":"12.00" }
      ]
    }                
                

    访问JSON元素

    要使用JSONPath在JSON数据中查询元素,请使用以下语法。这里,$表示数据层次结构的根,并且elementName是要查询的元素节点的名称。

     
    $.elementName
                    

    以下表达式查询customerName前面的JSON示例中元素。

     
    $.customerName

    前面的表达式从前面的JSON记录返回以下内容。

     
    John Doe

    注意

    路径表达式区分大小写。表达式从前面的JSON示例$.Name 返回null

    注意

    如果路径表达式指定的位置不显示任何元素,则返回表达式null以下表达式null从前面的JSON示例返回 ,因为没有匹配的元素。

     
    $.customerId

    访问嵌套的JSON元素

    要查询嵌套的JSON元素,请使用以下语法。

     
    $.parentElement.element

    以下表达式查询city前面的JSON示例中元素。

     
    $.address.city

    前面的表达式从前面的JSON记录返回以下内容。

     
    Anytown

    您可以使用以下语法查询更多级别的子元素。

     
    $.parentElement.element.subElement

    以下表达式查询street前面的JSON示例中元素。

     
    $.address.streetAddress.street

    前面的表达式从前面的JSON记录返回以下内容。

     
    AnyStreet

    访问数组

    使用方括号([]内的数组索引表达式查询数组目前,唯一支持的索引表达式是 0:,表示返回数组中的所有元素。

    返回的数据格式取决于数组索引表达式是否是路径中的最后一个表达式:

    • 当数组索引是路径表达式中的最后一个表达式时,该数组的所有内容都将作为单个数据行中的单个字段返回。

    • 当数组索引表达式之后存在嵌套表达式时,该数组将“展平”。换句话说,数组中的每个元素都作为单独的数据行返回。

    要将数组的整个内容作为单行查询,请使用以下语法。

     
    $.arrayObject[0:]

    以下表达式查询orders前面的JSON示例中元素的全部内容 它将数组内容返回到单行的单个列中。

     
    $.orders[0:]

    前面的表达式从前面的JSON记录返回以下内容。

     
    [{"orderId":"23284","itemName":"Widget","itemPrice":"33.99"},{"orderId":"61322","itemName":"Gadget","itemPrice":"22.50"},{"orderId":"77284","itemName":"Sprocket","itemPrice":"12.00"}]

    要将数组中的各个元素作为单独的行进行查询,请使用以下语法。

     
    $.arrayObject[0:].element

    以下表达式查询orderId前面的JSON示例中元素,并将每个数组元素作为单独的行返回。

     
    $.orders[0:].orderId

    前面的表达式从前面的JSON记录返回以下内容,每个数据项作为单独的行返回。

     

    23284

    63122

    77284

    注意

    如果查询非阵列元素的表达式包含在查询单个数组元素的模式中,则对阵列中的每个元素重复非阵列元素。例如,假设前面的JSON示例的模式包含以下表达式:

    • $ .customerName

    • $ .orders [0:]的orderId。

    在这种情况下,来自样本输入流元素的返回数据行类似于以下内容,name每个orderId元素都重复该元素。

     

    约翰·多伊

    23284

    约翰·多伊

    63122

    约翰·多伊

    77284

    注意

    以下限制适用于Amazon Kinesis Data Analytics中的数组表达式:

    • 数组表达式中仅支持一个级别的解除引用。不支持以下表达式格式。

       
      $.arrayObject[0:].element[0:].subElement
    • 架构中只能展平一个数组。可以引用多个数组作为包含数组中所有元素的一行返回。但是,只有一个数组可以将每个元素作为单独的行返回。

      包含以下格式的元素的模式是有效的。此格式将第二个数组的内容作为单个列返回,对第一个数组中的每个元素重复。

       
      $.arrayObjectOne[0:].element
      $.arrayObjectTwo[0:]                        

      包含以下格式的元素的模式无效。

       
      $.arrayObjectOne[0:].element
      $.arrayObjectTwo[0:].element

    其他考虑因素

    使用JSONPath的其他注意事项如下:

    • 如果JSONPath表达式中的单个元素未访问任何数组,则会为处理的每个JSON记录创建一行。每个JSONPath表达式对应一个列。

    • 当数组被展平时,任何缺少的元素都会导致在应用程序内部流中创建空值。

    • 数组总是扁平化为至少一行。如果不返回任何值(即,数组为空或未查询其元素),则返回具有所有空值的单个行。

      以下表达式返回前面的JSON示例中具有空值的记录,因为在指定的路径中没有匹配的元素。

       
      $.orders[0:].itemId

      前面的表达式从前面的JSON示例记录返回以下内容。

       

      空值

      空值

      空值

      https://docs.aws.amazon.com/kinesisanalytics/latest/dev/about-json-path.html

  • 相关阅读:
    PrintWriter、PrintStream的苦头 缓冲区问题
    BufferedImage与byte[]互转
    求两个日期的间隔天数
    Timer和TimerTask详解
    Java连接Access数据库
    根据value字段对map进行排序
    java collections读书笔记(3)Arrays
    java collections读书笔记(4) stack
    运行时异常与一般异常有何异同?(转)
    java collections读书笔记(7) bitset
  • 原文地址:https://www.cnblogs.com/a00ium/p/10322952.html
Copyright © 2011-2022 走看看