在Java / Jackson中从“数组”中获取元素

时间:2018-07-23 21:17:54

标签: java json rest jackson

我有一个请求,在这里得到这样的响应:

[
  [
    {
      "id": 0,
      "name": "xxxx"
    },
    {
      "id": 1,
      "name": "yyyy"
    },
  ]
]

如您所见,对象是“封装的”,而我发现解析它们的唯一方法是:

private static final TypeReference<List<List<Map<String, Object>>>> test = new TypeReference<List<List<Map<String, Object>>>>() {};

public List<List<Map<String, Object>>> getTransactions() throws IOException {
    return mapper.convertValue(send("/someapi/), test);
}

这似乎非常不方便,因为要访问我必须“ .get(i).get(j)”的对象。这实际上是这样做的方式还是我做错了?

1 个答案:

答案 0 :(得分:0)

如果您不想将所有内容反序列化为Java对象,则可以使用JsonPathJayWay implementation。基本上,您使用String路径来告诉解析器您想要什么。这是一个测试,其中获取第二个JSON对象的名称的路径为$[0][1].name

import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class JsonPathTest {

    private final String json = "[\n" +
            "  [\n" +
            "    {\n" +
            "      \"id\": 0,\n" +
            "      \"name\": \"xxxx\"\n" +
            "    },\n" +
            "    {\n" +
            "      \"id\": 1,\n" +
            "      \"name\": \"yyyy\"\n" +
            "    }\n" +
            "  ]\n" +
            "]";

    @Test
    public void testIt() {
        DocumentContext jsonContext = JsonPath.parse(json);
        String secondNamePath = "$[0][1].name";
        String name = jsonContext.read(secondNamePath);

        assertEquals("yyyy", name);
    }
}

您需要添加依赖项

    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.1.0</version>
    </dependency>

另请参见: