项目之间接口调用时发生了这个异常。查了一段时间才发现原因,写个博客纪念一下~
Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 16, fieldName customerInfo
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:343)at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseRest(JavaBeanDeserializer.java:822)
at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_2_AcpCustomerInfoMessageRequestData.deserialze(Unknown Source)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:185)
at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_1_AcpPayMessageRequestData.deserialze(Unknown Source)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:185)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:621)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:339)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:243)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:456)
原因:
1. X 类
public class X {
public String s;
public T t; //T 对象
public String getS() {
return s;
}
public void setS(String s) {
this.s= s;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t= t;
}
}
public class T{
public String ts ;
public String getTs() {
return ts;
}
public void setTs(String ts) {
this.ts= ts;
}
}
2. 定义了一个X 类型的x对象,并实例化,然后转成Json
X x = new X();
x.setS ("1");
T t = new T();
t.setTs("2")
x.setT(t);
String result = JSON.toJSONString(x)
3.
Json 转化为bean 时,bean里内嵌了一个bean变量。另一个接口需要对2 中的数据进行处理,处理时把t 赋值给了String类型变量,需要将t对应的Json值进行转译“ 。当再转化为X类型时,转换就会有问题。
转译后数据:
{"s":"1","t":"{\"ts\":\"2\"}"}
因此,此时key t 对应的是String 类型的value ,不再是Json ,所以会出现 except { ,actual string
测试例子:
String s2 = "{\"test\":\"111111\"}";
JSON json = new JSONObject();
((JSONObject) json).put("t",s2);
log.info( json.toJSONString());
JSON.parseObject(.toJSONString(), X.class)
note: t 为null 也可以正确转换