Java 与 Json的互相转换
这几天一直在做Java解析Json数据的一个项目,因为初识json,所以很多东西都是有着懵懂的认识。这里写下我解析时遇到的问题和收获。
我解析json时用到的是json-lib包。下载地址:http://json-lib.sourceforge.net。用这个包时,还要用到其他几个支持包:commons-lang.jar、commons-logging.jar,commons-beanutils.jar、xom-1.0-2005-01-05.jar、ezmorph-1.0.1.jar,以上包都可在http://json-lib.sourceforge.net下载。
先给出2个简单的例子。
1.java2json
样例:
public class testJson{
public static void main(String[] args) {
String json
= "{\"name\":\"reiz\"}";
JSONObject
jsonObj = JSONObject.fromObject(json);
String name
= jsonObj.getString("name");
jsonObj.put("initial", name.substring(0, 1).toUpperCase());
String[]
likes = new String[] { "JavaScript", "Skiing", "Apple Pie" };
jsonObj.put("likes", likes);
Map<String, String> ingredients = new
HashMap<String, String>();
ingredients.put("apples", "3kg");
ingredients.put("sugar", "1kg");
ingredients.put("pastry", "2.4kg");
ingredients.put("bestEaten", "outdoors");
jsonObj.put("ingredients",ingredients);
System.out.println(jsonObj);
}
}
输出结果:
{"name":"reiz","initial":"R","likes":["JavaScript","Skiing","Apple
Pie"],"ingredients":{"apples":"3kg","pastry":"2.4kg","bestEaten":"outdoors","sugar":"1kg"}}
java2json的资料网上很多,此不具体研究。
2.javafromjson
例子:
public class testJson{
public static void main(String[] args) {
String json =
"{x:'1',y:'2',userId:'112',element:[{id:'123',name:'haha'},{id:'456',name:'hehe'}]}";
JSONObject obj =
JSONObject.fromObject(json);
String x =
obj.getString("x");
String userid =
obj.getString("userId");
System.out.println("x is:" +
x);
System.out.println("userId
is:" + userid);
//
数组array结果:[{"id":"123","name":"haha"},{"id":"456","name":"hehe"}]
JSONArray jsonArray =
obj.getJSONArray("element");
for (int i = 0; i
< jsonArray.size(); i++) {
System.out.println("element " + i + " :" + jsonArray.get(i));
}
}
}
输出:
x is:1
userId is:112
element 0 :{"id":"123","name":"haha"}
element 1 :{"id":"456","name":"hehe"}
从上例可以看出,若取某一数组,可用json.get(i)取出。若想继续取出数组中第i个元素内的某一个值,如取出数组第一个元素中id的值,可用
(JSONObject)json.get(0).getInt("id")取出,为了看出细节,我们设取第二个元素中name的值,代码如下:
JSONObject obj2 = JSONObject.fromObject(array.get(1));
System.out.println(obj2.getString("name"));
输出结果为
hehe
可以看出一般步骤为:将要目标字符串转为JSON对象(JSONObject.fromObject()方法),再根据相应方法取出该对象中需要的值。
如果我们要将json反序列化为javabean呢?
String
jsonStr =
"{x:1,\"userId\":\"112\",element:[{id:'123',name:'haha'},{id:'456',name:'hehe'}]}";
Map<String,Class<?>>
m = new
HashMap<String,Class<?>>();
m.put("x",
Integer.class);
m.put("userId",
String.class);
m.put("element",Element.class);
Jsontobean
myBean = (Jsontobean)JSONObject.toBean(
JSONObject.fromObject(jsonStr), Jsontobean.class, m );
System.out.println("x: " +
myBean.getX());
System.out.println("userId: "
+ myBean.getUserId());
for(Element e :
myBean.getElement()){
System.out.println(e.getId() +"," + e.getName());
}
public class Jsontobean {
private int
x = 1;
private
String userId = "112";
private
List<Element> element;
public int
getX() {
return x;
}
public void
setX(int x) {
this.x = x;
}
public
String getUserId() {
return userId;
}
public void
setUserId(String userId) {
this.userId = userId;
}
public
List<Element> getElement() {
return element;
}
public void
setElement(List<Element> element)
{
this.element = element;
}
}
public class Element {
private int
id;
private
String name;
private
Element source;
public int
getId() {
return id;
}
public void
setId(int id) {
this.id = id;
}
public
String getName() {
return name;
}
public void
setName(String name) {
this.name = name;
}
public void setSource(Element source) {
this.source = source;
}
public Element getSource() {
return source;
}
public
String toString(){
return "" + id + "," + name;
}
}
输出:
x: 1
userId: 112
123,haha
456,hehe
-------
1)JSONObject to DynaBean
所谓动态bean即是java运行的时候根据情况创建的,而不是程序员已经写好了的Bean。JsonLib会自动根据Json格式数据创建字段,然后创建一个包含这些字段的Object。代码片段:
- String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
- JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str );
- DynaBean bean = (DynaBean) JSONSerializer.toJava( jsonObject );
- assertEquals( "JSON", bean.get("string") );
- assertEquals( new Integer(1), bean.get("integer") );
- assertEquals( new Double(2.0), bean.get("double") );
- assertEquals( Boolean.TRUE, bean.get("boolean") );
2)JSONObject to JavaBean
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。
这种方法和动态转换的区别在于,动态转换仅仅只是转为Object,而静态转换是转换为已经定义过的实体类,会自动映射。JSONObject.toBean()的参数介绍。
Java 与 Json的互相转换的更多相关文章
- 使用json-lib进行Java和JSON之间的转换 [转]
[转] http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库,提供将Java对 ...
- Java对象 json之间的转换(json-lib)
在这里主要简单的介绍一下,如何使用json-lib这个工具包来完成Java对象(或集合)与json对象(或集合)之间的转换~ 1. Java对象转换成json(既创建json) 关键类:JSONObj ...
- 【转】使用json-lib进行Java和JSON之间的转换
原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库,提供将Java ...
- 使用json-lib进行Java和JSON之间的转换
1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能. 2. ...
- 使用json-lib进行Java和JSON之间的转换【转载】
1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能. 2. ...
- JAVA中JSON字符串格式转换
alibabab版本 即com.alibaba.fastjson *以下Node为实体类 //JSON字符串->Map Map map1 = (Map)JSON.parse(strJson); ...
- Java集合 Json集合之间的转换
1. Java集合转换成Json集合 关键类:JSONArray jsonArray = JSONArray.fromObject(Object obj); 使用说明:将Java集合对象直接传进JSO ...
- java中json和字符串互转及日期转换 练习
一:以下是用到的jar名称: commons-beanutils-1.6.jar commons-collections-3.2.1.jar commons-lang-2.6.jar commons- ...
- JAVA中使用alibaba fastjson实现JSONObject、Object、Json字符串的转换
JAVA中使用alibaba fastjson实现JSONObject.Object.Json字符串的转换 Object转JSON字符串:String jsonStr = JSONObject.toJ ...
随机推荐
- mapreduce的组件介绍
第一部分:重要的组件 Combiner •什么是Combiner •combine函数把一个map函数产生的<key,value>对(多个key, value)合并成一个新的<key ...
- 《深入分析JavaWeb技术内幕》学习笔记
第一章 深入Web请求过程 1.1 B/S网站架构概述 HTTP协议采用无状态的短连接的通信方式.通常一次请求就完成一次数据交互,通常也对应一个业务逻辑. 当在浏览器里输入一个URL,首先会请求DNS ...
- explain的使用
MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. mysql. row ************ ...
- NAT虚拟网络配置
NAT虚拟网络配置(Linux能上网) 1.先设置虚拟机的虚拟网络,设置里面的子网ip和网关ip地址: 有两种方式:①setup命令(不选DHCP,因为它是动态分配IP地址的) ②vi /etc/s ...
- ERROR 2003 (HY000): Can't connect to MySQL server on "192.168.xxx.xxx" (111)
mac homebrew 安装的mysql5.6 除本机外无法被其他ip的电脑访问. 网上查原因 有几个: 1.my.cnf配置中 查看是否有 bind-address = 127.0.0.1 ...
- 002.VNC配置部署
一 安装图形界面 在系统中安装相关图形界面 yum -y install xorg* yum -y install gnome* yum -y install glx* 或者 yum groupi ...
- 新手:Qt之QLabel类的应用
在Qt中,我们不可避免的会用到QLabel类.而Qlabel的强大功能作为程序员的你有多少了解? 下面,跟着我一起在来学习一下吧! 1.添加文本 Qlabel类添加文本有两种方式,一种是直接在实现时添 ...
- Javascript中Object常用方法学习
1.Object.assign 函数(对象)(JavaScript) 将来自一个或多个源对象中的值复制到一个目标对象.语法: Object.assign(target, ...sources ); 此 ...
- JDK1.8快速入门
JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就合并到一起了. 愿编写java代码的过程 ...
- rabbitmq学习(四) —— 发布订阅
为了说明这种模式,我们将建立一个简单的日志系统.这个系统将由两个程序组成,第一个将发出日志消息,第二个将接收并处理日志消息.在我们的日志系统中,每一个运行的接收程序的副本都会收到日志消息. 交换器(E ...