反序列化Json的问题



给定以下json文件:

{
"noticiaDTOs": [
{
"idiomaPais": {
"idioma": {
"id": 3,
"iso6391": "pt"
},
"pais": {
"id": 1,
"sigla": "BR"
}
},
"linguagem": null,
"defaultLanguage": 1,
"idiomaNoticia": {
"id": 114,
"conteudo": "<p>uhuhuhuhuhu</p>",
"titulo": "uhuhuhuhuhu",
"resumo": "<p>huhuhuhuhu</p>"
},
"fileDTO": {
"profileDTO": {
"filetype": "application/json",
"value": " O BASE 64 DA IMAGEM"
},
"nome": "pt-BR"
},
"tags": [
{
"dtCriacao": "2020-10-07T12:48:16.775+0000",
"dtAlteracao": "2020-10-07T12:48:16.775+0000",
"ativo": true,
"id": 4,
"nome": "Política",
"tag": "POLI"
}
]
},
{
"idiomaPais": {
"idioma": {
"id": 4,
"iso6391": "en"
},
"pais": {
"id": 10,
"sigla": "US"
}
},
"linguagem": null,
"defaultLanguage": 2,
"idiomaNoticia": {
"id": "",
"conteudo": [],
"titulo": [],
"resumo": []
},
"fileDTO": {
"profileDTO": {}
},
"tags": [
{
"dtCriacao": "2020-10-07T12:48:16.775+0000",
"dtAlteracao": "2020-10-07T12:48:16.775+0000",
"ativo": true,
"id": 4,
"nome": "Política",
"tag": "POLI"
}
]
},
{
"idiomaPais": {
"idioma": {
"id": 5,
"iso6391": "it"
},
"pais": {
"id": 11,
"sigla": "IT"
}
},
"linguagem": null,
"defaultLanguage": 2,
"idiomaNoticia": {
"id": "",
"conteudo": [],
"titulo": [],
"resumo": []
},
"fileDTO": {
"profileDTO": {}
},
"tags": [
{
"dtCriacao": "2020-10-07T12:48:16.775+0000",
"dtAlteracao": "2020-10-07T12:48:16.775+0000",
"ativo": true,
"id": 4,
"nome": "Política",
"tag": "POLI"
}
]
}
],
"usuario": {
"dtCriacao": "2020-04-27T20:14:53.748+0000",
"dtAlteracao": "2020-10-23T16:19:32.809+0000",
"ativo": true,
"id": 39,
"pessoa": {
"dtCriacao": "2020-04-27T20:14:53.484+0000",
"dtAlteracao": "2020-04-27T20:14:53.484+0000",
"ativo": true,
"nome": "Fenacon T.I",
"nascimento": null,
"inscricaoEstadual": null,
"email": "tifenacon@gmail.com",
"telefone": "321321321231",
"celular": "2323123123123",
"cnpj": "70899341000126",
"razaoSocial": "Fenacon T.I",
"idPessoa": 244
},
"perfilUsuario": {
"dtCriacao": "2020-01-08T02:00:00.000+0000",
"dtAlteracao": "2020-01-08T02:00:00.000+0000",
"ativo": true,
"id": 1,
"nome": "Administrador",
"perfil": "ADMINISTRADOR"
},
"senha": "$2a$10$RUSfuzwbWGGd/8jqh0Ltm.XrV8q3gdW8K7Dfg0/7HCWkKgLFZhafe",
"logado": false,
"primeiro_acesso": false
},
"tags": [
{
"dtCriacao": "2020-10-07T12:48:16.775+0000",
"dtAlteracao": "2020-10-07T12:48:16.775+0000",
"ativo": true,
"id": 4,
"nome": "Política",
"tag": "POLI"
}
]
}

i got this method for read this

@PostMapping
@RequestMapping("/update/{id}")
@ResponseStatus(HttpStatus.CREATED)
public List<NoticiaIdiomaDTO> update(@RequestBody NoticiaIdiomaDTO noticiaIdiomaDTO, @PathVariable("id")Long id) throws NoSuchAlgorithmException {
List<NoticiaIdiomaDTO> noticiasIdiomasDTO = new ArrayList<NoticiaIdiomaDTO>();
try {
Noticia noticia = new Noticia();
List<NoticiaDTO> noticiaDTOs = noticiaIdiomaDTO.getNoticiaDTOs();
String nameImage = new String();
if (noticiaIdiomaDTO.getFileDTO() != null) {
nameImage = uploadImage(noticiaIdiomaDTO.getFileDTO());
//int i = 0;
}
int i = 0;
for(NoticiaDTO noticiaDTO : noticiaDTOs) {
if(noticia.getId() != null) {
if(noticiaDTO.getFileDTO()!=null && noticiaDTO.getFileDTO().getProfileDTO().getValue() != null) {
uploadFile(noticiaDTO.getFileDTO());
if(noticiaDTO.getDefaultLanguage() == 1) {
noticia.setThumbnail(nameImage);
//Pais pais = new Pais();
Optional<Pais> pais = paisService.porId(1);
//pais.setId(paisService.getByUsuario(noticiaIdiomaDTO.getUsuario().getId()).getId());
noticia.setPais(pais.get());
noticia.setId(null);
//noticia.setConteudo(noticiaIdiomaDTO.getNoticiaDTOs().get(0).getIdiomaNoticia().getConteudo());
//noticia.setTitulo(noticiaIdiomaDTO.getNoticiaDTOs().get(0).getIdiomaNoticia().getTitulo());
noticia.setUsuario(noticiaIdiomaDTO.getUsuario());
//noticia.setAtivo((noticia.getAtivo()) == false)?2:noticia.getAtivo());
//noticia.setUrl(EnvironmentsUtil.getEnvironmentImage());
service.atualizar(noticia);
NoticiaTAG noticiaTag = new NoticiaTAG();
noticiaTag.setNoticia(noticia);
noticiaTag.setTag(noticiaDTO.getTags().get(i));
noticiaTagService.atualizar(noticiaTag);
IdiomaNoticia idiomaNoticia = new IdiomaNoticia();
idiomaNoticia = noticiaDTO.getIdiomaNoticia();
idiomaNoticia.setNoticia(noticia);
idiomaNoticia.setIdioma(noticiaDTO.getIdiomaPais().getIdioma());
idiomaNoticiaService.atualizar(idiomaNoticia);
}
}
if(valid) {             
uploadFile(noticiaDTO.getFileDTO());
}
};
noticiasIdiomasDTO.get(i).setNoticiaDTOs(noticiaDTOs);
i++;
}
}catch (Exception e) {
// TODO: handle exception
throw new AppException("Erro Interno no Servidor.");
}
return noticiasIdiomasDTO;
}

但是,我收到了这个错误:

2012-02-25 15:39:48.329 WARN 16204—[nio-8080-exec-1] .w.s.m.s s。DefaultHandlerExceptionResolver: Resolved [org.springframework.http.converter.]HttpMessageNotReadableException: JSON解析错误:无法从START_ARRAY令牌中反序列化java.lang.String实例;嵌套异常是com.fasterxml. jacksondatabind.excs . mismatchedinputexception:无法反序列化START_ARRAY令牌之外的java.lang.String实例[来源:(PushbackInputStream);line: 1, column: 65973](通过参考链:br.com.ifenacon.idbs.orm.model.custom.NoticiaIdiomaDTO["noticiaDTOs"]- " java.util.ArrayList[1]- " br.com.ifenacon.idbs.orm.model.custom.noticito ["idiomaNoticia"]- " br.com.ifenacon.idbs.orm.model.IdiomaNoticia[" contudo"])]

问题是,在json中,您提供的上下文有两种类型(列表和字符串):

"conteudo": [],

"conteudo": "<p>uhuhuhuhuhu</p>",

这意味着它不能从List反序列化为String。反之亦然

这可能是一个糟糕的json文件。如果不是,你可以将它反序列化为Object然后在代码中使用toString()并确定它是否应该是一个列表并从那里手动反序列化它,或者直接使用它作为字符串

真正的错误是

不能反序列化java.lang.String的START_ARRAY实例[来源:[PushbackInputStream];行:1,列:65973](通过参考链:br.com.ifenacon.idbs.orm.model.custom.NoticiaIdiomaDTO(">noticiaDTOs")→java.util.ArrayList[1]→br.com.ifenacon.idbs.orm.model.custom.NoticiaDTO(">idiomaNoticia")→br.com.ifenacon.idbs.orm.model.IdiomaNoticia(">conteudo"]]>

p>如果你看一下JSON,这对应于
"noticiaDTOs": [
{
"idiomaNoticia": {
"conteudo": "<p>uhuhuhuhuhu</p>",
}
}
]

但是你也有一个

"noticiaDTOs": [
{
"idiomaNoticia": {
"conteudo": [],
}
}
]

如果你需要一个String或Array,你需要检查你的数据模型。(给定的错误,我认为你定义它为字符串)你不能使用这两个相同的字段。这表明问题是你的JSON,那是不正确的。数组需要替换为字符串(或者您的数据模型需要更改为使用列表类型+必须在JSON中更改字符串项)

最新更新