【已解决】JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token;
前后端联调,JSON转换问题
JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token;
【已解决】JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token;
上述问题为:前后端联调,类型转换不一致问题 不能将数组等转换为String类型
在我进行前后端联调的时候,发现前端传过来的JSON数据为:
{
"customAttributeItems": [
{
"text": "wq"
}
],
"name": "eq",
"brandIds": [
{
"id": 3,
"text": "三星"
},
{
"id": 4,
"text": "小米"
}
],
"specIds": [
{
"id": 28,
"text": "手机屏幕尺寸"
}
]
}
上述这种格式为复杂JSON格式,并且左边的值对应的是一个数组,而数组中有对象,然而我在传输到后台接收的格式为String类型,也就是为下边:
发现我接收的格式为String类型,找到了错误原因!
解决
又因为我前端引入的是外部JS文件实现的传输的JSON数据,所以不能将前端的JSON数据转换为字符串,因此,可以使用后端中间类来完成数据的转换
1、引入json转换工具
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
2、创建对应的转换类
public class TypeTemplateAddReq {
private Long id;
/**
* 模板名称
*/
private String name;
/**
* 关联规格
*/
private JSONArray specIds;
/**
* 关联品牌
*/
private JSONArray brandIds;
/**
* 自定义属性
*/
private JSONArray customAttributeItems;
//get set方法省略,自己生成
}
3、使用中间转换类接收
@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;
}
上述就是可以通过中间类来完成JSON数据之间的转换了