作者:曹祺
Blog: http://blogs.sun.com/greysh
Web: http://www.greysh.com
Email: Qi.Cao@Sun.com
本文链接:
http://developers.sun.com.cn/blog/functionalca/entry/json_lib%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8
本文工程源文件:
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_JSONLIB.zip

难度:入门

1)JSON简介
2)JSON/LIST转换
3)JSON/MAP转换
4)JSON/动态Bean转换
5)JSON/静态Bean转换
6)JSON/XML输出

1.JSON简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,基于JavaScript,但是不仅仅限于此。
详情可以参考www.json.org
例如一段XML
<?xml version="1.0" encoding="utf-8"?>
 <shop>
  <name>饭店</name>
<city>北京</city>
 </shop>
用JSON表示如下:
{
  "name":"饭店",
  "city":"北京"
}
XML的解析得考虑子节点父节点关系,而JSON的解析难度相当低,很多控件,尤其是ajax相关的数据交换很多都用json.

2)JSON/LIST转换
本教程解析采用的json-lib,官方网站为http://json-lib.sourceforge.net/,本教程参考官方教程
环境需要配置的jar如下
commons-beanutils和ezmorph控制反射
commons-collections是apachecommons的子项目,扩展了java集合类
commons-lang扩展了java.lang包
commons-logging日志类
xom是xml解析类,可以参考www.xom.nu
junit单元测试用的jar
json-lib核心jar
项目文件夹中拥有货物参数(Shop)和货物参数列表(ShopList)两个实体
Shop包含name和property两个字段,ShopList包含Shop的列表
对应的json是
String s = "[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'},{name:'显卡类型',property:'p3'},{name:'硬盘容量',property:'p4'},{name:'处理器',property:'p5'},{name:'内存',property:'p6'},{name:'型号',property:'p7'},{name:'货号',property:'p8'},{name:'品牌',property:'p9'}]";
把这样的数据结构作为用户定义个人信息存入数据库可以达到个性化参数的作用,
比如shopex的数据库中很多表就是用的json数据类型。因为用户自己添加的参数的长度是不固定的
比如上述例子就拥有9个用户自定义的参数
当用户需要填写这些参数的时候,需要转化为list,然后在struts2的view去显示
完成的代码可以参考附件的ArrayUtil文件
核心代码仅仅就一行JSONArray jsonArray = JSONArray.fromObject(s);
得到这个jsonArray后要转化为ArrayList,需要用循环遍历,如下
for (int i = 0; i < jsonArray.size(); i++) {
Object o = jsonArray.get(i);
JSONObject jsonObject = JSONObject.fromObject(o);
Shop Person = (Shop) JSONObject.toBean(jsonObject, Shop.class);
list.add(Person);
}
然后得到的list就是普通的ArrayList了

3)JSON/MAP转换
当我们初始化完一个map,放入json可以直接放入
Map<String, String> map = new HashMap<String, String>();
map.put("name", "重量");
map.put("property", "p1");
JSONObject jsonObject = JSONObject.fromObject(map);
核心代码为
JSONObject jsonObject = JSONObject.fromObject(map);
JsonLib会自动映射
完成例子见附件MapUtil.java

4)JSON/动态Bean转换
所谓动态bean即是java运行的时候根据情况创建的,而不是程序员已经好了的Bean
JsonLib会自动根据Json格式数据创建字段,然后创建一个包含这些字段的Object
本例子中采用JUNIT做单元测试验证,见DynamicBean.java
String s = "{name:'重量',property:'p1'}";
JSONObject jsonObject = JSONObject.fromObject(s);
Object bean = JSONObject.toBean(jsonObject);
assertEquals(jsonObject.get("name"), PropertyUtils.getProperty(bean,"name"));
assertEquals(jsonObject.get("property"), PropertyUtils.getProperty(bean,"property"));

5)JSON/静态Bean转换(StaticBean.java)
JSONLIB在转换的时候会自动查找关系,比如子类和父类
例如JSON数据源
String s = "{'shopList':[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'},{name:'显卡类型',property:'p3'},{name:'硬盘容量',property:'p4'},{name:'处理器',property:'p5'},{name:'内存',property:'p6'},{name:'型号',property:'p7'},{name:'货号',property:'p8'},{name:'品牌',property:'p9'}]}";
存入Map
map.put("shopList", Shop.class);
ShopList shopList = (ShopList) JSONObject.toBean(JSONObject.fromObject(s), ShopList.class, map);
JSONObject.toBean()方法的三个参数分别表示数据源对应的JSON对象,转化后的对象ShopList和数据源map
然后这样也可以取得ShopList
这种方法和动态转换的区别在于,动态转换仅仅只是转为Object
而静态转换是转换为已经定义过的实体类,会自动映射(这点类似Ibatis)

6)JSON/XML输出
如果自己用String的方法转化为XML输出要写很多代码,然后条用JSONLIB,核心代码仅仅一步
String xmlObject = xmlSerializer.write(object);
比如
String s = "{name:'重量',property:'p1'}";
XMLSerializer xmlSerializer = new XMLSerializer();
JSONObject object = JSONObject.fromObject(s);
String xmlObject = xmlSerializer.write(object);
System.out.println(xmlObject);

输出结果为
<?xml version="1.0" encoding="UTF-8"?>
<o>
<name type="string">重量</name>
<property type="string">p1</property>
</o>

JSON-LIB快速入门相关推荐

  1. Json Schema快速入门

    Json Schema快速入门 JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范.它被写在 IETF 草案下并于 2011 年到期.JSON 模式: 描述现有数据格式. 干净的人 ...

  2. JSON数据结构(A、快速入门篇)(Yanlz+Data+JsonArray+JsonObject+JsonValue+JsonMapper.ToJson+JsonMapper.ToObject+)

    <JSON数据结构> 版本 作者 参与者 完成日期 备注 Data_JSON_V01_1.0 严立钻 2018.08.24 ++++一个好用的JSON在线编辑:http://www.kjs ...

  3. 【Vue 快速入门】从零开始搭建 VUE + Element UI后台管理系统框架

    [Vue 快速入门]从零开始搭建 VUE + Element UI后台管理系统框架 前言 后台管理系统前端框架,现在很流行的形式都是,上方和左侧都是导航菜单,中间是具体的内容.比如阿里云.七牛云.头条 ...

  4. pythongoogle.probuf.timestamp_gRPC快速入门(一)——Protobuf简介

    gRPC快速入门(一)--Protobuf简介 一.Protobuf简介 1.Protobuf简介 Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化 ...

  5. Docker容器化技术教程,24小时快速入门

    Docker介绍 Docker简介和安装 Docker是什么 为什么使用Docker 和普通虚拟机的对比 打包.分发.部署 小结 Docker部署的优势 Docker通常用来做什么 重要概念:镜像.容 ...

  6. Kubernetes CKA认证运维工程师笔记-Docker快速入门

    Kubernetes CKA认证运维工程师笔记-Docker快速入门 1. Docker 概念与安装 1.1 Docker 是什么 1.2 Docker 基本组成 1.3 版本与支持平台 1.4 Do ...

  7. (十一) ELK快速入门

    本文为学习笔记,主要用于记录本人学习过程.部分内容为转载!!!!. ELK快速入门一-基本部署 ELK简介 什么是ELK?通俗来讲,ELK是由Elasticsearch.Logstash.Kibana ...

  8. 啃K8s之快速入门,以及哭吧S(k8s)单节点部署

    啃K8s之快速入门,以及哭吧S(k8s)单节点部署 一:Kubernets概述 1.1:Kubernets是什么? 1.2:Kubernets特性 1.3:Kubernets群集架构与组件 1.3.1 ...

  9. Elasticsearch7.17 一: 快速入门

    文章目录 Elasticsearch7.17: 快速入门 ElasticSearch简介 ElasticSearch相关概念 基本概念 ElasticSearch概念 ElasticSearch安装运 ...

  10. Docker快速入门,看这个就够了

    Docker快速入门 一.Docker介绍 1.1 Docker背景 1.2 Docker概念 1.3 Docker的优势 1.4 Docker的三个基本概念 二.Docker的安装和使用 2.1 安 ...

最新文章

  1. 算法实验--主函数只有五行的Floyed的算法以及最短路径输出
  2. 蓝桥杯2015初赛试题
  3. 深入理解Kubelet核心执行框架
  4. mac 不能连接wi-fi_如何阻止Mac自动连接到Wi-Fi网络
  5. while语句的使用
  6. Popush项目团队开发章程
  7. 【第5篇】Python爬虫实战-读取临时邮箱内容
  8. ios弧形进度条_iOS手把手教你实现圆形进度条
  9. 软考中级软件设计师笔记第一章计算机组成与体系结构
  10. 高等数学 下册 第九章 偏导数 笔记
  11. 在word里批量插入由文件创建对象,word宏定义批量插入对象
  12. 如何学习PLC编程,有没有什么好的方法?
  13. 【谷歌浏览器】国内如何配置谷歌浏览器使用
  14. 基于FPGA的LVDS接口设计
  15. HCIP 数通资料下载 肖哥视频
  16. 蒋建平:国内云计算刚刚起步
  17. Android 一键加速
  18. 制作你的专属BB8机器人
  19. Java 基础系列(二十二) --- Maven到底是什么? 如何使用
  20. Linux系统如何安装Python?新手教程

热门文章

  1. HDFS Federation 架构设计
  2. python弹球游戏实验报告_Python实战案例:用Python写一个弹球游戏,就是这么强
  3. 阿里巴巴和四十大盗(背包问题)
  4. JVM类加载机制-面试
  5. Windows Update 错误 80072ee2
  6. 你还在为找电子书籍而焦虑吗?Ylibrary分布式图书馆将是你解决的完美方案。
  7. Mabtech丨艾美捷EBI3特异性单克隆抗体
  8. yarn application 命令列表
  9. 计算机毕业论文内容参考|基于Android的旅游攻略APP的设计与实现
  10. 搜狗王小川说输入法的未来是自动问答,那么这个技术究竟发展得怎么样了?...