首页 > 解决方案 > JSON 对象无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例

问题描述

我有一个带有 json 类型的“数据”列的 postgres 表。我想将数据保存到此表中,但是当我尝试使用以下输入将数据保存到表中时,出现以下错误。

21-03-18 00:06:34 [http-nio-9090-exec-10] WARN  o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver.logException - Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
 at [Source: (PushbackInputStream); line: 2, column: 11] (through reference chain: com.ge.digital.oa.moa.dto.SavedFilterDto["json"])]

输入是

{
  "json": {"key": "12345678", "fieldName": "part", "operator": "eq", "operands": ["599320"]},
  "name": "xxxxx",
  "sso": "502622018"
}

DTO 代码是:

SuppressWarnings("serial")
@Data
@Getter @Setter @AllArgsConstructor @NoArgsConstructor
@Builder(toBuilder=true)
public class SavedFilterDto implements Serializable {

    private int id;    
    private String name;        
    @JsonProperty("json")
    private String json;
    private String sso;

服务代码:

@Transactional
private SavedFilter buildAndSaveSavedFilterObject(String name, String sso, String object, SavedFilter savedFilter) throws SQLException {
    PGobject jsonObject = new PGobject();
    jsonObject.setType("json");
    jsonObject.setValue(object);
    savedFilter = savedFilter.toBuilder().name(name).json(jsonObject).user(getUserById(sso)).build();
    return savedFilterRepo.save(savedFilter);
    
}

实体代码:

@SuppressWarnings("serial")
@Entity
@Getter @Setter @AllArgsConstructor @NoArgsConstructor
@Builder(toBuilder=true)
@Table(name="saved_filters")

public class SavedFilter implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

   
    @Column(name="data", columnDefinition = "json")
    private PGobject json;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_sso")
    private User user;

如果我将 dto 代码中的 json 参数更改为 Object,那么我在 PGobject.setValue() 中收到错误,因为它接受字符串并且将对象转换为 String 会产生一些运行时错误 如何解决此问题

标签: javajsonpostgresqljpajava-8

解决方案


推荐阅读