关于json序列化(javaBean转Json的细节处理)

目录
  • json序列化(javaBean转Json的细节)
    • 三种常见的jsonjar序列化
      • fastjson
      • Jackson
      • Gson
  • json序列化的处理
    • 还是要从最基础的说起
    • 正如上面所说的

json序列化(javaBean转Json的细节)

Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式

三种常见的json jar序列化

fastjson

阿里巴巴提供的fastjson,当用json转换实体类时

  • --无get开头的方法,将找不到序列器。
  • --如果有get开头的方法,但是无此get方法后面的字段,也找不到序列器[元数据一体化的项目落到此坑]。
  • --证明它与get开头的方法有关。
  • --fastJson在转换java对象为json的时候,fastjson默认转换是不序列化null值对应的key的。
//当字段为基本数据类型时,例如当字段类型为int类型时:
private int start;
private int limit;
// 我如果不set值的时候,会序列化为下面这样
"limit":0,"start":0

默认为都是0了,而我的目标是如果不设置值的时候,它们不会出现。

我是简单地通过把他们的类型改为Integer了。应该有其它通过自定义序列化行为的方式来解决,暂不研究。

但是如果想把null对应的key序列化出来呢?

那就要仔细看看fastjson转换java对象为json的时候的入参了:也就是这个方法:

JSONObject.toJSONString(Object object, SerializerFeature... features)

Fastjson的SerializerFeature序列化属性:

  • QuoteFieldNames:输出key时是否使用双引号,默认为true
  • WriteMapNullValue:是否输出值为null的字段,默认为false
  • WriteNullNumberAsZero:数值字段如果为null,输出为0,而非null
  • WriteNullListAsEmpty:List字段如果为null,输出为[],而非null
  • WriteNullStringAsEmpty:字符类型字段如果为null,输出为”“,而非null
  • WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null

结合上面,SerializerFeature... features是个数组,那么我们可以传入我们想要的参数,比如想序列化null,案例如下:

public static void main(String[] args) {
AutoPartsSearchRequest request = new AutoPartsSearchRequest();
request.setKeywords("123");
request.setSortingField("234242");
String str = JSONObject.toJSONString(request, SerializerFeature.WriteMapNullValue);
System.out.println(str);
}

Jackson

java开源的Jackson类,也与get开头的方法有关【同上】。

jackson默认是序列化null对应的key的,也就是说不管你对象属性有没有值,在转换json的时候都会被序列化出来
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
AutoPartsSearchRequest request = new AutoPartsSearchRequest();
request.setKeywords("123");
request.setSortingField("234242");
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(request);
System.out.println(str);
//输出结果(此处就不格式化了):{"sortingField":"234242","partsClassifyId":null,"partsSubClassifyId":null,"sortingDirection":null:......
}

同理,想要不序列化null也是可以的,具体如下:

实体上

@JsonInclude(Include.NON_NULL)
 
//将该标记放在属性上,如果该属性为NULL则不参与序列化
//如果放在类上边,那对这个类的全部属性起作用
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化

代码上

ObjectMapper mapper = new ObjectMapper(); 
mapper.setSerializationInclusion(Include.NON_NULL);
 
//通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化

注意:只对VO起作用,Map List不起作用,另外jackson还能过滤掉你设置的属性,具体的就各位自己去研究源码了

Gson

Google提供的Gson,该gson序列化只与属性(字段)有关,与get开头的方法无关。

gson和fastjson一样,默认是不序列化null值对应的key的,具体案例如下:

public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
AutoPartsSearchRequest request = new AutoPartsSearchRequest();
request.setKeywords("123");
request.setSortingField("234242");
Gson g = new GsonBuilder().create();
String str = g.toJson(request);
System.out.println(str);
//输出结果:{"sortingField":"234242","keywords":"123"}
}

若是想序列化null值对应的key,只需要将以上创建代码改成以下代码就行:

Gson g = new GsonBuilder().serializeNulls().create();

json序列化的处理

在json的数据处理过程中,最让人无奈的就是json serializable的问题,遇到的多了,慢慢就总结了一点经验。

还是要从最基础的说起

正如上面所说的

  • 在将dict, list等python对象编码成json字符串的时候就要用到json.dumps()而将json字符串解码为python 对象时用的是json.loads()
  • 至于其他的基础知识查文档都可以看到,我主要说一下遇到问题怎么解决。
class JSONEncoder(json.JSONEncoder):
    """ solve the problem that ObjectId and datetime can't serializable"""
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        if isinstance(o, datetime):
            return o.isoformat()
        if isinstance(o, UUID):
            return o.hex
        return json.JSONEncoder.default(self, o)

直接将遇到的不能转换的类型分装成一个类,尤其是在mongodb的数据处理中,经常能碰到objectid ,datetime,uuid的转换错误,以后要是遇到别的继续添加就是。

其中ObjectId要从bson引入。

from bson import ObjectId

datetime也要引入也有可能遇到NoneType的情况

NoneType要从types引入

from types import NoneType

UUID要从uuid引入

from uuid import UUID

接下来就是在处理的函数中调用这个类即可。

比如说我们有一个python_dict,想要将其转化为json_str

json_str= json.dumps(python_dict,cls=JSONEncoder,indent=4)

其中参数cls 是我们自己封装的类,indent参数一个数字,也可以不加,在这加的原因后面会提到。

如果我们想要让打印出来的json_str具有醒目的格式,indent则会很有用,至于具体的数字是多少,随你设定,设置为4是因为和python的缩进是一致的,看起来舒服而已。

如果想要在前端页面中显示出来json的样式。

有两种方式:

  • 在前端使用js实现在将数据存入数据库之前我们就将数据转换为标准的 json 字符串,直接在页面调用即可。
  • 比如在flask中,直接使用<pre>标签即可。
<pre>{{json_str}}</pre>

这样显示出来的就是标准的json样式了,对于内容一目了然。

补充:

其中有一个比较坑的地方。其实到这一步的时候我们该做的都已经做了,讲道理来说应该没什么问题了。但是在实践的过程中我发现页面展示出来的结果中文格式还是不正确。是'\u***\u**'这样的unicode编码。回到数据库查看发现数据在存的时候就存的是unciode的编码。

最后查看json_str的格式,发现确实是unicode的编码,这样当然不会显示正确了。

所以最后一步再加上

json_str = json_str.encode('utf-8')

将json字符串以'utf-8'进行编码。

这样问题就完美的得到了解决。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java Bean与json对象间的转换实例讲解

    java Bean与json对象间的转换 /** * 一 JSON.parseObject() 单个对象 或map 大括号{} * 二 JSON.parseArray() 多个对象 数组[] 复杂的要在类中定义类 * 三 JSON.toJSONString() javaBean与JSON格式字符串之间的转换 * * 四 javaBean与json对象间的转换使用:JSON.toJSON(obj),然后使用强制类型转换,JSONObject或者JSONArray */ @Test public v

  • 详谈JSON与Javabean转换的几种形式

    JSON格式的数据传递是最常用的方法之一,以下列出了常用的几种形态以及与Javabean之间的转换: String json1="{'name':'zhangsan','age':23,'interests':[{'interest':'篮球','colors':['绿色','黄色']},{'interest':'足球','colors':['红色','蓝色']}]}"; String json2="[{'name':'zhangsan'},{'name':'lisi'},{

  • 常用json与javabean互转的方法实现

    JSONObject 与 JSONArray区别 JSONObject: { "area": "武汉", "name": "张三", "age": 25 } JSONArray: [{ "area": "武汉", "name": "张三", "age": 25 }, { "area": &

  • Java中json与javaBean几种互转的讲解

    一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: public class Student { //姓名 private String name; //年龄 private String age; //住址 private String address; public String getName() { return name; } public void setName(String name) { this.name = name; }

  • 关于json序列化(javaBean转Json的细节处理)

    目录 json序列化(javaBean转Json的细节) 三种常见的jsonjar序列化 fastjson Jackson Gson json序列化的处理 还是要从最基础的说起 正如上面所说的 json序列化(javaBean转Json的细节) Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 三种常见的json jar序列化 fastjson 阿里巴巴提供的fastjson,当用json转换实体类时 --无

  • JSON序列化Redis读取出错问题解决方案

    报错 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 1, fastjson-version 1.2.44 问题分析 在写入缓存的时候,hash结构,它的value值,在写入前使用JSON

  • Python如何把不同类型数据的json序列化

    现代网络应用Web APP或大型网站的后台一般只有一个,然后客户端却是各种各样的(iOS, android, 浏览器), 而且客户端的开发语言很可能与后台的开发语言不一样.这时我们需要后台能够提供可以跨平台跨语言的一种标准的数据交换格式供前后端沟通(这就是Web API的作用).如今大家最常用的跨平台跨语言数据交换格式就是JSON(JavaScript Object Notation)了.JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),人们很容易进行

  • Python常用标准库详解(pickle序列化和JSON序列化)

    目录 常用的标准库 序列化模块 序列化和反序列化 使用场景 dumps & loads dump & load JSON序列化模块 使用场景 支持的数据类型 JSON和pickle的区别 序列化函数 json和pickle实际使用过程中的一些问题 pickle和json的区别总结 常用的标准库 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中存储的数据只

  • Json序列化和反序列化方法解析

    复制代码 代码如下: /// <summary>        /// Json序列化,用于发送到客户端        /// </summary>        public static string ToJsJson(this object item)        { DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType()); using (MemoryStr

  • JSON序列化与解析原生JS方法且IE6和chrome测试通过

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&qu

  • asp.net JSON 序列化技术分析

    在ASP.NET 3.5开始,.NET平台下共支持两种序列化方式: 复制代码 代码如下: 1.DataContractSerializer 2.JavascriptSerializer 前者主要是根据数据契约(DataContract)进行序列化,通过如下定义的数据契约: 代码 复制代码 代码如下: <DataMember()> _ Public Class Model <DataMember()> Public Property PropertyA As String <D

  • C#中实现Json序列化与反序列化的几种方式

    什么是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write and easy for machines to parse and generate. JSON is a text format that is completely language independent. 翻译:Json[javascrip

  • 基于Json序列化和反序列化通用的封装完整代码

    1. 最近项目已经上线了 ,闲暇了几天 想将JSON的序列化以及反序列化进行重新的封装一下本人定义为JSONHelp,虽然Microsoft 已经做的很好了.但是我想封装一套为自己开发的项目使用.方便后期的扩展以及开发使用. 2. 什么是 JSON ? JSON:JavaScript 对象表示法(JavaScript Object Notation).JSON 是存储和交换文本信息的语法.类似 XML.JSON 比 XML 更小.更快,更易解析.  现在开发Web应用程序 JSON 是 必不可少

  • C#中 Json 序列化去掉null值的方法

    要将一个对象序列化,可是如果对象的属性为null的时候,我们想将属性为null的都去掉. 在这里我使用Newtonsoft.Json.dll 记录一下序列化以及反序列化 json字符串转对象 Model model=JsonConvert.DeserializeObject<Model>(val); 将对象转化为json格式字符串 string jsonString = JsonConvert.SerializeObject(obj); 那么如何序列化为json时过滤掉NULL呢?? var

随机推荐