Java 如何将响应解码为列表?

Java 如何将响应解码为列表?,java,java-11,Java,Java 11,我收到以下答复: [{"id":1,"someField":"someValue"}] 这是我的要求: private HttpRequest doRequest(String body, URI uri) { return HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(body)) .uri

我收到以下答复:

[{"id":1,"someField":"someValue"}]
这是我的要求:

private HttpRequest doRequest(String body, URI uri) {
    return HttpRequest.newBuilder()
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .uri(uri)
            .headers(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
            .build();
}
我试着这么做,但没有成功:

protected ClassToDecode createResponse(HttpResponse<HttpBodyCodec> response) {
    return response.body().decodeAs(ClassOfResponse.class);
}
这样做,字段中不会填充响应。
我无法解码我收到的列表,我应该怎么做?

您的类
ClassToDecode
无法工作的原因是因为它试图在json对象中找到键
响应
,如下所示:

{"responses":[{"id":1,"someField":"someValue"}]}
做你想做的事情最简单的方法是:

public class ClassToDecode extends ArrayList<ClassResponse> {
}
公共类ClassToDecode扩展了ArrayList{
}
这应该是我们的工作,并帮助您解码


关于。

您的类
ClassToDecode
不起作用的原因是,它试图在json对象中找到键
响应
,如下所示:

{"responses":[{"id":1,"someField":"someValue"}]}
做你想做的事情最简单的方法是:

public class ClassToDecode extends ArrayList<ClassResponse> {
}
公共类ClassToDecode扩展了ArrayList{
}
这应该是我们的工作,并帮助您解码


问候。

您试图做的事情并没有真正起作用,因为:

  • Jackson看到的JSON类型是一个列表/数组
  • Jackson没有看到可以反序列化的列表。只有一件事有一个清单。这是一个至关重要的区别
你有几个选择

  • 你得到了马可的建议,这将把你的类编码成一个列表。(如果你想真正喜欢,还有AbstractList,我认为Marco的建议更好,因为你不必为一个一次性类添加任何逻辑。)如果你需要反序列化到那个特定类,我认为这是一个很好的建议

  • 您可以只使用一个列表而不是ClassToDecode。如果你班上没有什么特别的东西,这就足够了。但事实可能并非如此。当然,如果需要,您以后也可以只
    newclasstodecode(反序列化djsonlist)
    。如果您只需要一个对象进行反序列化,这可能是您最好的选择

  • 如Marco所指出的,如果控制发送的JSON,则可以在名为responses的字段中创建列表。这样,objectmapper应该能够处理一些事情

  • 您可以使用自定义反序列化程序来反序列化列表。但正如我们所说,用大炮射杀麻雀


  • 您试图做的事情并没有真正起作用,因为:

    • Jackson看到的JSON类型是一个列表/数组
    • Jackson没有看到可以反序列化的列表。只有一件事有一个清单。这是一个至关重要的区别
    你有几个选择

  • 你得到了马可的建议,这将把你的类编码成一个列表。(如果你想真正喜欢,还有AbstractList,我认为Marco的建议更好,因为你不必为一个一次性类添加任何逻辑。)如果你需要反序列化到那个特定类,我认为这是一个很好的建议

  • 您可以只使用一个列表而不是ClassToDecode。如果你班上没有什么特别的东西,这就足够了。但事实可能并非如此。当然,如果需要,您以后也可以只
    newclasstodecode(反序列化djsonlist)
    。如果您只需要一个对象进行反序列化,这可能是您最好的选择

  • 如Marco所指出的,如果控制发送的JSON,则可以在名为responses的字段中创建列表。这样,objectmapper应该能够处理一些事情

  • 您可以使用自定义反序列化程序来反序列化列表。但正如我们所说,用大炮射杀麻雀


  • 上述答案是正确的。但是,我用这种方式解决了这个问题:

    protected List<ClassToDecode> createResponse(HttpResponse<HttpBodyCodec> response) {
        return response.body().decodeAs(new TypeRef<>() { });
    }
    
    protectedlist-createResponse(HttpResponse-response){
    返回response.body().decodeAs(新的TypeRef(){});
    }
    

    这只是另一种解决方法。

    以上这些答案是正确的。但是,我用这种方式解决了这个问题:

    protected List<ClassToDecode> createResponse(HttpResponse<HttpBodyCodec> response) {
        return response.body().decodeAs(new TypeRef<>() { });
    }
    
    protectedlist-createResponse(HttpResponse-response){
    返回response.body().decodeAs(新的TypeRef(){});
    }
    

    这是另一种解决方法。

    您遇到了什么异常?我没有异常,但我的字段没有填写may help的3.2节您遇到了什么异常?我没有异常,但我的字段没有填写may help的3.2节