json使用笔记

开源项目

  • org.json 这个项目比较弱,但是不少项目在引用
  • Gson 这个之前一直用,后来Fastjson出来后,看别人用的多,也就改用Fastjson了
  • Fastjson
    • 网上说速度比较快,对速度还不敏感,但其接口用起来比Gson更简洁
    • 定制化,可以通过@JSONField解决JSON名称中包含下划线、大小写等不规范问题
    • 甚至还可以定制哪个字段是否输出

规范

开始参考了json规范,这个文档写的比较乱,下面重新整理了下.另外官方文档也比较清楚

1.JSON语法

JSON文本是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个实字名。
以下是六个构造字符:

符号含义中文名称
begin-array[左方括号
begin-object{左大括号
end-array]右方括号
end-object}右大括号
name-separator:冒号
value-separator,逗号

在这六个构造字符的前或后允许存在无意义的空白符。

ASCII码名称
0x20空格符
0x09水平制表符
0x0A换行符
0x0D回车符

2.值

JSON必须(MUST)是一个对象、数组、数字或字符串,或者是实字名:
value = false / null / true / object / array / number / string
json-value
2.1. 实字名
只有三个 false null true
实字名必须(MUST)是小写的,且不允许有其它的实字名。
2.2. 对象
对象结构被表示为:一对大括号包围着零个或多个name/value对(或者是成员)。
json-object
2.3. 数组
数组结构表示为:方括号包围着零个或多个值(或是元素)。元素间以逗号相隔。
json-array
2.4. 数字
数字的表示法与其它多数编程语言相似。要点:
json-number
- 不允许有八进制及十六进制形式。
- 前面带有0也是被禁止的。
- 数字值不能表示成阿拉伯数字数字的序列(如Infinity和Nan是不允许的)。

2.5. 字符串
json-number
- string以引号开始与结束。
- 所有的Unicode字符都可以放置在引号中,除了转义字符:引号、反斜杆\、控制符(U+0000 - U+001F),这些字符可以用unicode编码表示:”\u005C”。
- 另一种办法,可以用两个转义字符序列来表示一些常用的字符。所以像只包含一个反斜杆字符的字符串可以更简洁的表示成”\”。

FastJson主要功能

详细官方文档
主要接口

public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray 
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject    
public static final  T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean 
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
public static final  List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 
public static final Object toJSON(Object javaObject); //6将JavaBean转换为JSONObject或者JSONArray。

几个常用功能:
1.不规范名称处理
可以把@JSONField配置在字段或者getter/setter方法 如@JSONField(name=”_ID”),详细可参考官方文档

2.日期处理
处理日期的API,序列化JSON.toJSONStringWithDateFormat(date, “yyyy-MM-dd HH:mm:ss.SSS”)

反序列化能够自动识别如下日期格式:

  • ISO-8601日期格式
  • yyyy-MM-dd
  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd HH:mm:ss.SSS
  • 毫秒数字
  • 毫秒数字字符串
  • .NET JSON日期格式
  • new Date(198293238)

3.定义某几个字段被序列化处理
使用SimplePropertyPreFilter过滤属性,参考


  SimplePropertyPreFilter filter = new SimplePropertyPreFilter(VO.class, "name1", "name2");
  JSON.toJSONString(vo, filter);

4.JSON格式化输出
如JSON.toJSONString(XX,SerializerFeature.PrettyFormat);

其它注意事项

  1. 如果包含内部类,需要增加static类修饰符,否则反序列化会失败
  2. 另外,在引用不同的框架或者库时,会使用不同的json框架,如IO框架是org.json,我业务代码中一直用FastJson,为了与业务代码融合,先把JSONObject进行toString,然后再toJSON,感觉好傻~~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值