java序列化json对象,java json序列化和反序列化

  java序列化json对象,java json序列化和反序列化

  

目录

json序列化(javaBean转json的细节)三种常见的json jar序列化fastjsonJacksonGsonjson序列化要从最基础的开始,如上所述。

 

  

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

Java对象转换成json时,如果对象中有空属性值,json序列化时要不要排序?比较以下json转换方法

 

  

三种常见的json jar序列化

 

  

fastjson

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

 

  -没有以get开头的方法,将找不到序列器。-如果有一个以get开头的方法,但是这个get方法后面没有字段,那么就找不到定序器了【元数据集成的项目就落入这个坑】。-证明与get开头的方法有关。- fastJson将java对象转换为Json时,fastJson的默认转换不序列化空值对应的键。//当字段为基本数据类型时,例如字段类型为int类型时:private int start私有int限制;//如果我不设置值,我就序列化到下面的‘limit’33600,‘start’33600默认都是0,我的目标是不设置值它们就不会出现。

  我只是把它们的类型改成了Integer。通过自定义序列化行为应该还有其他方法可以解决问题,暂时不研究了。

  但是如果要序列化对应null的键呢?

  然后再仔细看看fastjson把java对象转换成json时的参数:也就是这个方法:

  JSONObject.toJSONString(Object对象,SerializerFeature.特色)Fastjson的SerializerFeature序列化属性:

  QuoteFieldNames:输出key时是否使用双引号,默认值为trueWriteMapNullValue:是否输出空字段,默认值为falseWriteNullNumberAsZero:如果数值字段为空,则输出值为0,而不是nullwritenulllistasempty:如果列表字段为空,则输出为[]而不是nullWriteNullStringAsEmpty:如果字符类型字段为空,则输出为" "而不是nullwritenullbooleanasfalse:如果布尔字段为空,则输出为false而不是null。结合上述内容,SerializerFeature.特性是一个数组,所以我们可以传入我们想要的参数,例如,如果我们想要序列化null。案例如下:

  public static void main(String[]args){ AutoPartsSearchRequest request=new AutoPartsSearchRequest();request . set keywords( 123 );request . setsorting field( 234242 );string str=JSON object . tojsonstring(request,SerializerFeature。WriteMapNullValue);system . out . println(str);}

  

Jackson

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

 

  Jackson默认序列化null对应的键,也就是说不管你的object属性有没有值,在把json转换成public static void main时都会序列化(string [] args)抛出JSON GenerationException,JsonMappingException,io exception { AutoPartsSearchRequest request=new AutoPartsSearchRequest();request . set keywords( 123 );request . setsorting field( 234242 );object mapper mapper=new object mapper();string str=mapper . writevalueasstring(请求);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 cant 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'进行编码。

 

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

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • js把字符串转为json,json字符串转换成json对象
  • js把字符串转为json,json字符串转换成json对象,js 将json字符串转换为json对象的方法解析
  • json语法格式,json格式定义
  • json语法格式,json格式定义,Json格式详解
  • json格式数据类型,什么是JSON数据-其常见格式是什么-
  • json格式数据类型,什么是JSON数据-其常见格式是什么-,JSON 数据格式详解
  • json格式怎么写,json文件内容格式
  • json格式怎么写,json文件内容格式,json文件书写格式详解
  • json数组对象转化为json字符串,js把数组转化为json
  • json字符串转换成对象有哪几种方法,字符串转化为json的方法
  • json字符串转换成对象有哪几种方法,字符串转化为json的方法,JSON对象转化为字符串详解
  • json基础介绍与详细用法教程,json基础知识
  • json基础介绍与详细用法教程,json基础知识,JSON基础介绍与详细用法
  • json去掉反斜杠,json字符串中有反斜杠
  • json去掉反斜杠,json字符串中有反斜杠,详解json串反转义(消除反斜杠)
  • 留言与评论(共有 条评论)
       
    验证码: