【问题标题】:Looking for a particular data in JSON hashmap在 JSON 哈希图中查找特定数据
【发布时间】:2017-05-06 10:19:12
【问题描述】:

我需要在不同的 json 有效负载中查找 AccountNo 字段值。 AccountNo 可以存在于 json 有效负载中的任何级别。我需要检查 AccountNo 是否存在,然后在记录器中打印值。

我正在使用下面的丰富器,但我想遍历 mule 中的 Hashmap 以检查 AccountNo 键是否存在于任何地方,然后获取值。

还请建议是否有任何其他方式来解析 json 本身。 在 xpath "//AccountNo" 将在整个 xml 文档中查找 AccountNo。我追求类似的东西。

<enricher target="#[flowVars.myJsonMap]" doc:name="Message Enricher"> <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/> </enricher> <logger message="#[flowVars.myJsonMap.employees[0].AccountNo]" level="INFO" doc:name="Logger"/> </flow>

请在下面找到示例 json 有效负载

{
"Account": {
"AccountName": "John",
"AccountNo": "4234324"
 }
 }

{
"Order": {
"OrderId": "34234242",
"ServiceOrder": [
  {
    "AccountNo": "231232",
    "ServiceOrderId": "54654698787"
  },
  {
    "AccountNo": "231232",
    "ServiceOrderId": "78979879797"
  }
  ]
  }

【问题讨论】:

    标签: mule mule-studio mule-component mule-el


    【解决方案1】:

    因为它是一个哈希图

    您可以使用yourmap.get(keyvalue) 来获取价值。

    <logger message="#[flowVars.myJsonMap.yourkey?]" level="INFO" doc:name="Logger"/> 
    

    【讨论】:

    • 在这种情况下,我不知道我的密钥将嵌套在哪里。请在我的原始评论中找到上面的示例有效负载。
    【解决方案2】:

    根据您的问题,我假设如下:

    • 您的有效负载包含嵌套的地图和列表以及其他对象
    • AccountNo 可能存在于您有效负载的任何级别

    您可以使用 Groovy 转换器递归解析您的有效负载并收集列表中的所有现有 AccountNo:

    //recursively parse any Map or List in myObject
    //and store AccountNo objects accountNoList
    def parseObject(myObject, accountNoList) {
      if (myObject instanceof java.util.Map) {
        //if Map, check for AccountNo field
        if(myObject.AccountNo != null){
            accountNoList.add(myObject.AccountNo)
        }
    
        //seek for more AccountNo in Map
        for(e in myObject) {
          parseObject(e.value, accountNoList)
        }
      } else if (myObject instanceof java.lang.Iterable) {
        //if Iterable, parse each values
        for (value in myObject) {
           parseObject(value, accountNoList)
        }
      }
    }
    
    myJsonPayload = message.getInvocationProperty('myJsonPayload')
    myAccountNoList = [] //init an empty list which will be filled
    parseObject(myJsonPayload, myAccountNoList)
    return myAccountNoList
    

    然后只需使用 Logger。

    【讨论】:

    • 我可以用java做同样的事情吗?
    【解决方案3】:

    如果您不处理大量 json 数据,只需使用 JSONToXMLTransformer 将 json 转换为 XMl,然后使用 XPATH 在文档中的任何位置查找数据。这样,您可以避免编写任何额外的代码来解析 json 文件。

    【讨论】:

    • 使用嵌套的 json 标签 json 到 xml 转换器我发现不返回完整的有效负载。
    • 您能否提供重复“帐户”标签的 json 有效负载?我过去做过一些事情来使用 dataweave 递归地解析 json。我将检查相同的代码是否适用于您的有效负载。
    • 我在上面的原始评论中添加了示例有效载荷。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2014-03-13
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多