【问题标题】:json string-fields extraction, in Talend 5.5Talend 5.5 中的 json 字符串字段提取
【发布时间】:2014-07-10 11:50:08
【问题描述】:

我有下面的 json 字符串,我想从这个字符串中提取 "id" 之后的所有 "number":(15124,13498) 字段。

我正在尝试通过 java 代码中的 jsonpath 这样做:

String pd = JsonPath.read(jsonString, "$.response.data.number.id");`

但是由于错误的 jsonpath,我得到了一个异常,我应该写什么 jsonpath 在"number" 字段之后获取"id"

json 字符串下方:

{
    "response": {
        "code": 200,
        "msg": "Success",
        "data": {
            "number": {
                "id": "13498",
                "name": "(Not in used) Daniel - 30138444",
                "network_id": 1,
                "network_type": "Facebook",
                "currency": "USD",
                "currency_info": {
                    "prefix": "$",
                    "postfix": "",
                    "name": "US Dollars"
                },
                "timezone": {
                    "id": 92,
                    "code": "PST",
                    "region": "America",
                    "locality": "Los_Angeles",
                    "offset": -7,
                    "facebook_code": 1
                }
            }
        }
    }
}

【问题讨论】:

  • 确切的例外是什么?
  • 你的问题解决了吗?

标签: java json talend jsonpath


【解决方案1】:

一切正常

 String pd = JsonPath.read("{\n" +
            "    \"response\": {\n" +
            "        \"code\": 200,\n" +
            "        \"msg\": \"Success\",\n" +
            "        \"data\": {\n" +
            "            \"number\": {\n" +
            "                \"id\": \"13498\",\n" +
            "                \"name\": \"(Not in used) Daniel - 30138444\",\n" +
            "                \"network_id\": 1,\n" +
            "                \"network_type\": \"Facebook\",\n" +
            "                \"currency\": \"USD\",\n" +
            "                \"currency_info\": {\n" +
            "                    \"prefix\": \"$\",\n" +
            "                    \"postfix\": \"\",\n" +
            "                    \"name\": \"US Dollars\"\n" +
            "                },\n" +
            "                \"timezone\": {\n" +
            "                    \"id\": 92,\n" +
            "                    \"code\": \"PST\",\n" +
            "                    \"region\": \"America\",\n" +
            "                    \"locality\": \"Los_Angeles\",\n" +
            "                    \"offset\": -7,\n" +
            "                    \"facebook_code\": 1\n" +
            "                }\n" +
            "            }\n" +
            "        }\n" +
            "    }\n" +
            "}", "$.response.data.number.id");
    System.out.println(pd);

输出:

  13498

检查您是否在jsonString 中传递了正确的JSON

【讨论】:

  • “对我来说很好”不是答案。
  • @DmitryGinzburg 如果没有真正的问题,没有其他答案。你还有其他答案吗??
  • @DmitryGinzburg 嗯不错的意见。
【解决方案2】:

我认为根据您要查找的内容,您将获得一个 List 作为输出。我也觉得将数据字段作为数组而不是对象更明智。然后你可以尝试这样的事情;

List<String> ids = JsonPath.read(json, "$.response.data[*].number.id");

【讨论】:

  • 首先,它不称为“列表”,而是称为“数组”。从我个人的观点来看,为数据设置一个是有意义的,但话虽如此,这在很大程度上取决于输入的来源/方式。考虑到他想要所有 id 而不仅仅是一个,我只是想让 OP 的生活更轻松。
  • @RuchiraGayanRanaweera,在通过此类 cmets 之前阅读答案。
  • 你能在JSON 消息中看到任何List/Array 吗?
  • OP 明确表示上述消息无法通过,因为出现错误。而且那里没有任何ArrayList。无法将您的解决方案与此 JSON 消息相匹配?它可以解决这个问题吗?如果您使用此JSON 消息尝试您的解决方案,您将收到ClassCastException
  • 如果您通过一些简单的代码操作或通过一些简单的代码操作或手动更改 json 消息。只有这样你才能做我上面写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多