当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring WebClient将嵌套JSON数组反序列化为Flux?

罗烨霖
2023-03-14

我在Spring Boot(2.0.0. M1)应用程序中使用org.springframework.web.reactive.function.client.WebClient来查询返回嵌套数组的REST接口:

[
    [ "name1", 2331.0, 2323.3 ],
    [ "name2", 2833.3, 3838.2 ]
]

我现在尝试将此响应映射到对象的Flux。为此,我进行了以下调用:

WebClient webClient = WebClient.create("http://example.org");

Flux<Result> results = webClient.get().uri("/query").
    accept(MediaType.APPLICATION_JSON_UTF8).
    exchange().
    flatMapMany(response -> response.bodyToFlux(Result.class));

Result类看起来像这样:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.math.BigDecimal;

@Data
@JsonFormat(shape = JsonFormat.Shape.ARRAY)
public class Result {

    private final String name;
    private final BigDecimal value1;
    private final BigDecimal value2;

    @JsonCreator
    public Result(
        @JsonProperty String name,
        @JsonProperty BigDecimal value1,
        @JsonProperty BigDecimal value2) {
        this.name = name;
        this.value1 = value1;
        this.value2 = value2;
    }
}

不幸的是,我出现以下错误:

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/json;charset=utf-8' not supported

有谁能告诉我我做错了什么,或者告诉我一种更好的方法来将这种响应反序列化为流量,最好是以非阻塞的方式?

共有1个答案

羊越
2023-03-14

该问题与通量无关。

Jackson根本无法反序列化您的json对象,并且可能无法使用不同值的数组执行public Result(@JsonProperty String name,@JsonProperty BigDecimal value e1,@JsonProperty BigDecimal value e2)

最简单的解决方法是使用下一个构造函数实现。

@JsonCreator
public Result(Object[] args) {
     this.name = String.valueOf(args[0]);
     this.value1 = new BigDecimal(String.valueOf(args[1]));
     this.value2 = new BigDecimal(String.valueOf(args[2]));
}
 类似资料:
  • 我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?

  • 问题内容: 根据该 GSON可以反序列化内部类。我有JSON字符串的下一个片段: 我正在使用下一堂课: 并尝试解析我的JSON字符串: 但是我得到这个错误: 您能告诉我错误在哪里吗? 问题答案: 当我将Gson与嵌套类一起使用时,我总是需要使它们起作用。在您的链接中,他们说这是没有必要的,但是在 Gson文档中 明确指出: “ Gson还可以反序列化静态嵌套类。但是,Gson不能自动反序列化纯内部

  • 问题内容: 我有一个带有JSON数组的有效JSON对象。JSON数组没有花括号,并且包含逗号分隔的混合类型列表。看起来像这样: 我创建了一个反映JSON结构的类,为复杂数组提供了一个List: 我也用列表列表进行了测试: 子模型如下所示: 在我的program.cs文件中,我正在反序列化如下: 当我运行该程序时,子对象(Rows)始终为。我究竟做错了什么? 问题答案: Json.Net没有将数组自

  • 问题内容: 我从看起来像这样的API获取JSON: 我尝试了几种方法来在c#对象中表示此JSON(太多内容无法在此处列出)。我已经尝试过使用列表和字典,这是我尝试表示它的最新示例: 这是我用来反序列化JSON的方法: 包含和。并且包含,但是是。因此,除了反序列化之外,什么都没有。 它应该很简单,但是由于某种原因我无法弄清楚正确的对象表示形式 问题答案: 要使用,即: 假设项目名称和随响应而变化,并

  • 问题内容: 我有一个Vendor对象,可以从一个单独的“ vendor” json序列中反序列化,但是我想将此序列反序列化为一个,我只是想不出如何让Jackson合作。有小费吗? 问题答案: 您的数据存在问题,因为您的数组中有内部 包装 对象。想必你的对象被设计成手柄,,,但每次的多个对象也都包裹在一个对象与单一属性。 我假设您正在使用Jackson 数据绑定 模型。 如果是这样,那么有两件事要考

  • 问题内容: 我在反序列化一些json数据,获取InvalidCastExceptions之类的问题。 谁能指出我正确的方向? 这是我要反序列化的json; [{“ OrderId”:0,“名称”:“摘要”,“ MaxLen”:“ 200”},{“ OrderId”:1,“名称”:“详细信息”,“ MaxLen”:“ 0”}] 这是我的代码; 问题答案: OrderId是json中的一个Int(请注