您的位置:首页 > Web前端 > JavaScript

JSON工具学习记录--FastJSON

2016-05-14 09:55 507 查看
最近做项目,总是与json打交道,在用了即可json工具后,个人认为fastJson最好用,很方便,API也清晰可见,所以记录下使用方法,给需要的人提供帮助.(部分摘抄自网络)

一.API入口

Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

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> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> 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); 将JavaBean转换为JSONObject或者JSONArray。


对于上面实例解释下:

1. SerializeWriter:相当于StringBuffer

2. JSONArray:相当于List

3. JSONObject:相当于Map

二.使用实例

1.java对象转json串

//代码构造了几个按钮,按钮1,2,3,4是并列关系,5,6是1的子按钮
@Test
public void testJson(){
List<Button> buttons = new ArrayList<>();
Button button1 = new Button();
button1.setName("button1");
button1.setType("click");
Button button2 = new Button();
button2.setName("button2");
button2.setType("click");
Button button3 = new Button();
button3.setName("button3");
button3.setType("click");
Button button4 = new Button();
button4.setName("button4");
button4.setType("click");
Button button5 = new Button();
button5.setName("button5");
button5.setType("click");
Button button6 = new Button();
button6.setName("button6");
button6.setType("click");
button1.setSub_button(new Button[]{button5, button6});//设置5,6是1的子按钮
buttons.add(button1);
buttons.add(button2);
buttons.add(button3);
buttons.add(button4);
String obj = JSON.toJSONString(buttons);
System.out.println(obj);
}


看看打印出来的串

[
{
"name": "button1",
"sub_button": [
{
"name": "button5",
"type": "click"
},
{
"name": "button6",
"type": "click"
}
],
"type": "click"
},
{
"name": "button2",
"type": "click"
},
{
"name": "button3",
"type": "click"
},
{
"name": "button4",
"type": "click"
}
]


完全符合预期结果

2.json串转java泛型

还是继续刚才的例子,把刚才得到的串转回去

//泛型使用这种转换方式
List<Button> buttons1 = JSON.parseObject(obj, new TypeReference<List<Button>>(){});
System.out.println(buttons1.toString());


得到结果完全正确

[namebutton1--typeclick--sub_button[Lcom.haikong.model.menu.Button;@27d5a580, namebutton2--typeclick--sub_buttonnull,
namebutton3--typeclick--sub_buttonnull,
namebutton4--typeclick--sub_buttonnull]


3.json转java对象

按照官方文档给出的方法就好了

VO vo = JSON.parseObject("...", VO.class);


4.操纵一个json对象

操纵主要通过下面两个方法

1. JSONArray:相当于List//针对多个对象时转换

2. JSONObject:相当于Map

JSONArray jsonArray = JSON.parseArray(obj);
System.out.println(jsonArray.getJSONObject(1).get("name"));//获取json数组中第二个元素的name值


5.时间日期处理

fastjson处理日期的API很简单,例如:

JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")


使用ISO-8601日期格式

JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);


全局修改日期格式

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);


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

ISO-8601日期格式

yyyy-MM-dd

yyyy-MM-dd HH:mm:ss

yyyy-MM-dd HH:mm:ss.SSS

毫秒数字

毫秒数字字符串

.NET JSON日期格式

new Date(198293238)

更多使用参考官方文档即可

6.在springMVC中使用

<mvc:annotation-driven/>默认使用jackjson来解析的,按照下面替换下就可以使用fastjson了


<!-- 启用默认配置 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 配置Fastjson支持 -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json</value>
</list>
</property>
<property name="features">
<list>
<value>WriteMapNullValue</value>
<value>QuoteFieldNames</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>


7.备注

fastjson不支持直接对文件解析操作,可能后续版本会添加这样的功能,所以对于文件,需要先读取出来保存为string,然后才可以解析,这一点需求比较大的话建议用jackjson来解析,后者对文件操作封装的很不错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: