如题,当Gson序列化的Java对象中包含一个jsonStr的字段存储的事json格式的字符串,比如数据库中本身存储的就是json格式的varchar
jsonStr=
{"name":"chulainn","age":20,"interest":"霹雳布袋戏"}
Gson序列化后就变成
{\"name\":\"chulainn\",\"age\":20,\"interest\":\"霹雳布袋戏\"}
返回到前端。解决这种现象有多中方式
。
Gson没有Jackson的
@JsonRawValue
注解。 JsonRawValue:无转换的将属性值写入到json 字符串中。如果使用Jackson在jsonstr字段上直接加上注解就可以了。
1.使用Java原型的方式
需要新建一个对象包含 name,age,interest这些属性,把jsonstr字段反序列化为对象 然后再把整个对象序列化为json字符串
2 .自定义一个JsonSerializer对象 注册到Gson的TypeAdapter中
public class CallResult{
private String name;
private int age;
private String jsonStr;
get() set()...
}
class CustomParserFoo implements
JsonSerializer<CallResult>
{
@Override
public JsonElement serialize(CallResult src,
Type typeOfSrc,
JsonSerializationContext context)
{
JsonObject element = new JsonObject();
JsonElement cachedArray = new JsonParser().parse(src.getJsonStr());
element.add("jsonStr", cachedArray);
element.addProperty("name",src.getName());
element.addProperty("age",src.getAge());
//element.addProperty();
System.out.println(CallResult.class.getDeclaredFields().length);
try {
int fieldLength = CallResult.class.getDeclaredFields().length;
Field[] fields = CallResult.class.getDeclaredFields();
for(int i = 0; i < fieldLength; i ++){
// Field field = fields[i];
// PropertyDescriptor pd = new PropertyDescriptor(field.getName(), src.getClass());
// Method rM = pd.getReadMethod();//获得读方法
// String name = rM.getAnnotatedReturnType().getType().getTypeName();
// System.out.println("name:" + name);
//element.addProperty(field.getName(),);
}
}catch (Exception e){
e.printStackTrace();
}
return element;
}
}
可以使用反射来赋值 这只是测试直接写死需要序列化的字段,使用反射需要给转化的字段加注解还得判断get方法返回类型...
创建Gson
Gson gson = new GsonBuilder()
.registerTypeAdapter(CallResult.class,new CustomParserFoo()).create();
CallResult been = new CallResult();
been.setName("tony")
been.setAge(20);
been.setJsonStr("{\"name\":\"chulainn\",\"age\":20,\"interest\":\"霹雳布袋戏\"}")
String result = gson.toJson(bean)
System.out.println(result)
打印结果 {"jsonStr":{"name":"chulainn","age":20,"interest":"霹雳布袋戏"},"name":"tony","age":20}
只有当转化的类是CallResult才会走自定义的转化