Gson序列化的对象包含json格式的子属性,json串被转义

如题,当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才会走自定义的转化


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值