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

通量解码异常:意外字符 ('[' (代码91)):期望双引号开始字段名

韦志新
2023-03-14

在将Flux JSON解码为Java对象时,我遇到以下异常:

2019-02-25 13:44:39.136 TRACE [{}] 25292 --- [reactor-http-nio-4] o.s.w.r.f.c.ExchangeFunctions            : [762021a9] Response 200 OK, headers={masked}
2019-02-25 13:44:39.195 ERROR [{}] 25292 --- [reactor-http-nio-4] r.M.C.2                                  : | onError(org.springframework.core.codec.DecodingException: JSON decoding error: Unexpected character ('[' (code 91)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('[' (code 91)): was expecting double-quote to start field name
 at [Source: UNKNOWN; line: 2, column: 3])
2019-02-25 13:44:39.196 ERROR [{}] 25292 --- [reactor-http-nio-4] r.M.C.2                                  : 
org.springframework.core.codec.DecodingException: JSON decoding error: Unexpected character ('[' (code 91)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('[' (code 91)): was expecting double-quote to start field name
 at [Source: UNKNOWN; line: 2, column: 3]
    at org.springframework.http.codec.json.Jackson2Tokenizer.tokenize(Jackson2Tokenizer.java:104) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]

按以下方式设置映射器编解码器属性无法解决此问题:

mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

这里是JSON响应:

[
  {
    "id": "111",
    "description": "xyz"
  },
  {
    "id": "222",
    "description": "pqr"
  }
]

下面是WebClient实现:

public Mono<List<ItemServiceResponse>> getItems(ItemServiceRequest itemServiceRequest) {
return webClient
        .post()
        .contentType(MediaType.APPLICATION_JSON)
        .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_STREAM_JSON.toString())
        .body(Mono.just(itemServiceRequest), ItemServiceRequest.class)
        .retrieve()
        .bodyToFlux(ItemServiceResponse.class)
        .collectList()
        .log();
}

以下是Java对象:

@Builder 
@Data 
@AllArgsConstructor 
@NoArgsConstructor 
public class ItemServiceResponse { 
  private String id; 
  private String description; 
}

共有2个答案

庾波光
2023-03-14

ObjectMapper期望从您的Json响应中映射一个对象作为ItemServiceACK,因此出现异常(映射器期望引用)。

您应该更新WebClient调用,以映射ItemServiceResponse的数组:

public Mono<List<ItemServiceResponse>> getItems(ItemServiceRequest itemServiceRequest) {
    return webClient
            .post()
            .contentType(MediaType.APPLICATION_JSON)
            .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_STREAM_JSON.toString())
            .body(Mono.just(itemServiceRequest), ItemServiceRequest.class)
            .retrieve()
            .bodyToFlux(ItemServiceResponse[].class) // <-- array of ItemServiceResponse
            .collectList()
            .log();
}
冯鸿光
2023-03-14

一个可怕的问题!!!我浪费了4-5天的时间来找出我的代码中的错误,并尝试了所有的排列组合,但都没有奏效。

但伙计们,邮差是罪魁祸首,是的,没错。

我得到的JSON的实际响应结构是:

{
  [
    {
      "id": "111",
      "description": "xyz"
    },
    {
      "id": "222",
      "description": "pqr"
    }
  ]
}

那是格式错误的JSON。但Postman以某种方式自动更正并给出了问题中提到的JSON的正确响应,我没有更多地关注响应,因为状态代码是200成功。

幸运的是,我触发了Curl命令并找到了根本原因。请不要相信邮递员。。。纠正不必要的事情是非常聪明的。

 类似资料:
  • }如果您运行该代码,您会发现它工作得很好。那么问题出在哪里?我必须在Oracle NoSQL数据库上执行同样的操作。了解与数据检索相关的任何部分并不重要,因为它们工作得很好,我已经测试过它们。代码非常相似: 我的目标是获得与第一段代码完全相同的结果。根据我的类tweet的属性,由''分隔的值字符串。 但是,这段代码被压缩在一个Jar文件中,并由数据库在记录的所有tweet上运行。我无法看到发生了什

  • 我在数据库中有一个Json字符串,但在Java对象中转换时,它给出了以下错误:

  • 嘿,我遇到了一个关于与jackson反序列化的问题,这里是我尝试过的和我得到的错误。 错误:com。fasterxml。杰克逊。果心JsonParseException:意外字符('}'(代码125)):应以双引号开始字段名 Java代码 我的JSON

  • 在解析JSONString()如下所示: 我得到以下例外: 通用域名格式。fasterxml。杰克逊。果心JsonParseException:意外字符('='(代码61)):在[Source:{assigned=[util]处,需要用冒号分隔字段名和值[junit]。TaskAudit@24c7b944]}; 第1行第11列] 有人能告诉我怎么解决吗。 编辑:这个函数的输入基本上是来自数据库的字

  • 一切都很好,这是一款多功能Vertx应用程序。但是,当使用集群时,在使用Hazelcast集群时,在事件总线中获取上述异常(不会将错误传递给处理程序)。由于JSON传递的一些数据很大,我假设数据被截断并导致这种情况。此后,如果您没有将接收/发送缓冲区的大小设置得足够大,那么HTTP中也会发生相同的错误,我认为在Hazelcast中这样设置它们: 会修复它不能修复的东西。错误如下所示: at[来源:

  • 你好堆叠花海, 奇怪的问题。我无法使用psql命令行参数导入。csv文件... 我不想使用excel保存,因为我有一些数字被转换成科学符号,在excel中打开文件时,前导零会立即删除。