我有一个请求,在这里得到这样的响应:
[
[
{
"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)”的对象。这实际上是这样做的方式还是我做错了?
答案 0 :(得分:0)
如果您不想将所有内容反序列化为Java对象,则可以使用JsonPath和JayWay 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>