【问题标题】:Problems with deserialize Json反序列化 Json 的问题
【发布时间】:2021-05-28 05:22:36
【问题描述】:

给定以下 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"
    }
  ]
}

我有这个方法来阅读这个:

@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;
    }

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

2021-02-25 15:39:48.329 WARN 16204 --- [nio-8080-exec-1] .wsmsDefaultHandlerExceptionResolver:已解决 [org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:无法反序列化实例来自 START_ARRAY 令牌的java.lang.String;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize of java.lang.String out of START_ARRAY token 在 [来源:(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"])]

【问题讨论】:

  • 能否也包括 NoticiaIdiomaDTO 的代码。这使您更容易理解您要反序列化的对象

标签: java arrays json spring-boot deserialization


【解决方案1】:

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

    "conteudo": [],

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

这意味着它不能从列表中反序列化为字符串。反之亦然

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

【讨论】:

    【解决方案2】:

    你真正的错误是

    无法反序列化 START_ARRAY 之外的 java.lang.String 实例 [来源:(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"])]

    如果你查看你的 JSON,这对应于

     "noticiaDTOs": [
        {
          "idiomaNoticia": {
            "conteudo": "<p>uhuhuhuhuhu</p>",
          }
        }
    ]
    

    但你也有其中之一

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

    如果您在此处需要字符串或数组,则需要检查您的数据模型。 (鉴于错误,我认为您将其定义为字符串)您不能将两者用于同一字段。这表明问题是您的 JSON,这是不正确的。数组需要替换为字符串(或者您的数据模型需要更改为使用列表类型 + 字符串项必须在 JSON 中更改)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多