有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我收到这样的回复:

[{"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);
}

My ClassToDecode有我的响应类列表:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@EqualsAndHashCode
public class ClassToDecode {
    private List<ClassResponse> responses;
}

还有我的ClassResponse和要解码的字段:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@EqualsAndHashCode
public class ClassResponse  {

  @JsonProperty("id")
  private Integer id = null;

  @JsonProperty("someField")
  private String someField = null;

}

这样,字段中就不会充满响应。 我无法解码我收到的列表,我该怎么做


共 (3) 个答案

  1. # 1 楼答案

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

    protected List<ClassToDecode> createResponse(HttpResponse<HttpBodyCodec> response) {
        return response.body().decodeAs(new TypeRef<>() { });
    }
    

    这只是解决问题的另一种方法

  2. # 2 楼答案

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

    {"responses":[{"id":1,"someField":"someValue"}]}
    

    做你想做的事情最简单的方法是:

    public class ClassToDecode extends ArrayList<ClassResponse> {
    }
    

    这应该是我们的工作,并帮助您解码

    问候

  3. # 3 楼答案

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

    • Jackson看到的JSON类型是一个列表/数组
    • Jackson没有看到可以反序列化的列表。只有列表的东西。这是一个至关重要的区别

    你有几个选择

    1. 你得到了马可的建议,这会把你的课程变成一个列表。(如果你想真正喜欢抽象列表,我认为马可的建议更好,因为你不必为一次性课程添加任何逻辑。)我认为这是一个很好的建议,如果你需要反序列化到特定的类

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

    3. 正如Marco所指出的,如果控制发送的JSON,就可以在名为responses的字段中创建列表。通过这种方式,objectmapper应该能够处理问题

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