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

2024-05-10 19:38

本文主要是介绍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 implementsJsonSerializer<CallResult>{@Overridepublic 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才会走自定义的转化


这篇关于Gson序列化的对象包含json格式的子属性,json串被转义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977370

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati