Erro de análise JSON: não é possível desserializar a instância de `java.lang.String` do token START_ARRAY:

Depuração conjunta de front-end e back-end, problemas de conversão JSON

JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token;

Erro de análise JSON: não é possível desserializar a instância de `java.lang.String` do token START_ARRAY: 

Os problemas acima são: depuração conjunta de front-end e back-end, conversão de tipo inconsistente, matrizes, etc., não podem ser convertidas para o tipo String.

Quando eu estava fazendo depuração conjunta no front-end e no back-end, descobri que os dados JSON passados ​​​​do front-end eram:

{
    "customAttributeItems": [
        {
            "text": "wq"
        }
    ],
    "name": "eq",
    "brandIds": [
        {
            "id": 3,
            "text": "三星"
        },
        {
            "id": 4,
            "text": "小米"
        }
    ],
    "specIds": [
        {
            "id": 28,
            "text": "手机屏幕尺寸"
        }
    ]
}

O formato acima é um formato JSON complexo, e o valor à esquerda corresponde a um array, e há objetos no array, porém, o formato que recebo ao transmitir para o background é do tipo String, que é o seguinte:

 Descobri que o formato que recebi era do tipo String e descobri a causa do erro!

resolver

E como meu front-end introduz dados JSON transmitidos por arquivos JS externos, os dados JSON do front-end não podem ser convertidos em strings, portanto, a classe intermediária de back-end pode ser usada para concluir a conversão de dados.

1. Apresente a ferramenta de conversão json

   <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.28</version>

 2. Crie a classe de conversão correspondente

public class TypeTemplateAddReq {

    private Long id;



    /**
     * 模板名称
     */
    private String name;

    /**
     * 关联规格
     */
    private JSONArray specIds;

    /**
     * 关联品牌
     */
    private JSONArray brandIds;

    /**
     * 自定义属性
     */
    private JSONArray customAttributeItems;
//get set方法省略,自己生成
}

3. Use classe de conversão intermediária para receber

 

@RequestMapping("/add")
    public String add( @RequestBody TypeTemplateAddReq req){
        //创建数据库映射的实体类
        TypeTemplate typeTemplate = new TypeTemplate();

        //将中间类的数据拷贝到 数据库映射的实体类中
        //这种拷贝是将id name那些类型对应上的数据拷贝进来
        BeanUtils.copyProperties(req,typeTemplate);

        //将中间类接受到的JSON数据,转换为String,并手动设置到数据库映射的实体类中 
           typeTemplate.setCustomAttributeItems(req.getCustomAttributeItems().toJSONString());
        typeTemplate.setBrandIds(req.getBrandIds().toJSONString());
        typeTemplate.setSpecIds(req.getSpecIds().toJSONString());
            //测试数据
//        System.out.println(typeTemplate);
//        String jsonString = JSON.toJSONString(typeTemplate);
//        System.out.println(jsonString);
            //进行service、DAO层等操作
        boolean s=  typeTemplateService.add(typeTemplate);

         //返回值根据自己的业务来返回
        return null;
    }

O acima é a conversão entre dados JSON que pode ser concluída por meio de classes intermediárias.

Guess you like

Origin blog.csdn.net/wang20000102/article/details/132394882