`

json lib 学习笔记

阅读更多

json-lib demo

JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean。
到http://json-lib.sourceforge.net下载json-lib-1.1-jdk15.jar,运行json还需要的包有:
jakarta commons-lang 2.4.jar
jakarta commons-beanutils 1.7.0.jar
jakarta commons-collections 3.2.jar
jakarta commons-logging 1.1.1.jar
ezmorph 1.0.6.jar
可在http://www.docjar.com上搜索下载。

 

javaScript与java对象之间的对应关系

JSON Java
string <=> java.lang.String, java.lang.Character, char
number <=> java.lang.Number, byte, short, int, long, float, double
true|false <=> java.lang.Boolean, boolean
null <=> null
function <=> net.sf.json.JSONFunction
array <=> net.sf.json.JSONArray (object, string, number, boolean, function)
object <=> net.sf.json.JSONObject

 

1. 将java数组和java集合转化成一个json数组
通过静态工厂方法JSONArray.fromObject()将一个java数组或集合转化成一个json数组对象JSONArray.
实例1:转化java数组

String [] array = {"a","d","1","b"};
JSONArray jsonArray = JSONArray.fromObject(array);
System.out.println(jsonArray);

 输出结果:["a","d","1","b"]//注意他们的顺序与java数组中的顺序是一致的。

 

实例2:转化List对象

String [] array = {"d","a","1","b"};
List list = new ArrayList();   
list.add( array );   
list.add( "second element");  
JSONArray jsonArray = JSONArray.fromObject(list);
System.out.println(jsonArray);

 输出结果:[["d","a","1","b"],"second element"]


实例3:转化字符串

String test = "['json','is','easy']";
JSONArray jsonArray = JSONArray.fromObject( test );   
System.out.println(jsonArray); 
 

使用JSONArray.fromObject()转化字符串时,字符串必须符合JSONArray的格式。

2.将Map或javaBean转化成JSONObject
实例4:转化Map

Map map = new HashMap();
map.put("name","json");
map.put("bool",Boolean.TRUE);
map.put("int",new Integer(1));
map.put("arr",new String[]{"a","b"});
map.put("func","function(i){return this.arr[i];}");
JSONObject json = JSONObject.fromObject(map);
System.out.println(json);

 输出:[“name”: “json”, “bool”:true, “int”,1, “arr”:[ “a”, “b”], “func”:function(i){return this.arr[i];}]

实例5:转化javaBean

public class TestBean {
	private String id;
	private String name;
	private int age;
	private String email;
	public TestBean() { 
   }
  public TestBean(String id, String name, int age, String email) {
	    super();
	    this.id = id;
	    this.name = name;
	    this.age = age;
	    this.email = email;
  }
 //以下为get、set方法
}

 输出:{"age":36,"email":"","id":"2","name":"xxhh"}
//这是一个json object,其实就是一个javascript对象。注意其中属性的顺序,是排过序的。

3.将JSONObject转化为javaBean对象
实例6:

String myJson = "{'age':36,'email':'','id':'2','name':'testName'}";
JSONObject jsonObject1 = JSONObject.fromObject( myJson );   
TestBean bean = (TestBean) JSONObject.toBean( jsonObject1, TestBean.class );   
System.out.println("beanName:" + bean.getName());

 输出:beanName:testName

 

4.将JSONArray转化为list对象:

实例7:

ExampleBean对象的代码如下:

public class ExampleBean {
private String	name;
	private String	id;
	private int	   age;
public ExampleBean() {
		super();
	}
public ExampleBean(String name, String id, int age) {
		super();
		this.name = name;
		this.id = id;
		this.age = age;
	}
//getter和setter方法
}

  测试代码:

public class Test {

	public static void main(String[] args) {
		List<ExampleBean> list1 = new ArrayList<ExampleBean>();
		for (int i = 0; i < 5; i++) {
			String name = "xxlong" + i;
			int age = 20 + i;
			ExampleBean bean = new ExampleBean(name, i + "", age);
			list1.add(bean);
		}
		JSONArray jsonArray = JSONArray.fromObject(list1);
		System.out.println("list1:" + list1);
		List<ExampleBean> list2 = JSONArray
		                .toList(jsonArray, ExampleBean.class);
		System.out.println("list2:" + list2);
		List<ExampleBean> list3 = JSONArray
        .toList(jsonArray);
		System.out.println("list3:" + list3);
	}
}

  输出结果如下所示:

list1:[ExampleBean@13a328f, ExampleBean@1cd8669, ExampleBean@337838, ExampleBean@119cca4, ExampleBean@ca2dce]
list2:[ExampleBean@765291, ExampleBean@26e431, ExampleBean@14f8dab, ExampleBean@1ddebc3, ExampleBean@a18aa2]
list3:[net.sf.ezmorph.bean.MorphDynaBean@17182c1[
  {id=0, age=20, name=xxlong0}
], net.sf.ezmorph.bean.MorphDynaBean@13f5d07[
  {id=1, age=21, name=xxlong1}
], net.sf.ezmorph.bean.MorphDynaBean@f4a24a[
  {id=2, age=22, name=xxlong2}
], net.sf.ezmorph.bean.MorphDynaBean@cac268[
  {id=3, age=23, name=xxlong3}
], net.sf.ezmorph.bean.MorphDynaBean@1a16869[
  {id=4, age=24, name=xxlong4}
]]

5.通过 Servlet 或 MVC 框架输出 JSON 时,需要设置正确的 MIME 类型(application/json)和字符编码。假定服务器使用 UTF-8 编码,则可以使用以下代码输出编码后的 JSON 文本:

response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(jsonObject);
out.flush();
out.close();

6.在前台处理jsonobject:

var json = {"customerGroupList":
[{"id":{"customerGroupId":1,"languageId":1},"lastModified":null,"name":"medium level","priceId":1},
{"id":{"customerGroupId":2,"languageId":1},"lastModified":null,"name":"medium level2","priceId":1},
{"id":{"customerGroupId":3,"languageId":1},"lastModified":null,"name":"level3","priceId":1}],
"searchResultList":[{"custAddress":"1 Way Street,NeverNever,,PostCode1","custFirstName":"Andy","custLastLogon":"19/01/2010","custLastName":"Admin","custlogons":25},
{"custAddress":"3 Way Street,NeverNever,,PostCode3","custFirstName":"Olly","custLastLogon":"18/12/2009","custLastName":"Order","custlogons":0},
{"custAddress":"1 Way Street,NeverNever,,12345","custFirstName":"John","custLastLogon":"18/12/2009","custLastName":"Doe","custlogons":0},
{"custAddress":"2 Way Street,NeverNever,,PostCode2","custFirstName":"Caty","custLastLogon":"18/12/2009","custLastName":"Catalog","custlogons":0}]};

 这是一个非常复杂的jsonobject对象.在后台,它是将一个个CustomerGroup对象和CustomerSearchResult对象分别存入的ArrayList中,然后再以customerGroupList和searchResultList为key存入HashMap中,最后转化为jsonobject对象传递到前台.在前台进行处理时,你可以把它看成一个变通地js对象,然后使用属性访问来得到它对应的属性值.

如:

//就可以得到一个js数组对象,即json对象的前面一部分.即用[]括隹的那个对象.
var custGroupList = json.customerGroupList;
//同样.它也是得到一个js数组对象
var array2 = json.searchResultList;
for(var i = 0 ; i < array2.length; i++){
    //得到array中的每一个对象
    var cust = array[i];
    var result = "";
//得到每一个对象的属性及属性值,当然也可以使用Object.attributeName.这 种方式得到对象的属性值,根据个人喜好
    for(var attrName in cust){
      result = "attribute name = " + attrName + "and attribute value = "  + cust[attrName];
    }
}

 

再如,你从后以会了一个如下所示的json对象,它在后台其实是一个map对象:

var mapping = {"B202":["B202","B402","B502","B702"],"B201":["B201","B401","B501","B701"],"B103":["B103","B403","B503","B703"],"B703":["B703"]}

 这时,比如你要取得B202的映射,你可以使用期mapping.B202,你得到的结果就是B202相对应的值,即:

["B202","B402","B502","B702"]

这在js中是一个数组,它具有数组具有的一切功能,它在后台中是java的一个list对象.如果你要动态的取值,比如传过来一个id,这个id可以是B202,B201或B103等等,比如,传进来的id=B202,这时,你就不能用mapping.id取值了,这样的话,它会去取mapping这个json对象中id属性这个值,而mapping对象中没有id这个属性,所有返回给你的是一个undefined,你应该使用mapping[id]这种方法来动态取值,这时它就会正确的返回结果:

["B202","B402","B502","B702"]

7.有关boolean值

如果你的Bean中有boolean属性值的话,你要注意boolean属性值的命名,如果你使用is开头,如isSucc,然后又是用eclipse生成它的setter和getter方法时,你就会遇到意想不到麻烦,因为你的setter方法不再是setIsSucc,而是setSucc,所以转化成Bean时它就会有问题

看例子:TestBoolean类代码如下所示:

public class TestBoolean {

	private boolean	isSucc;
	private String	msg;
	
    public TestBoolean() {
	    super();
	    // TODO Auto-generated constructor stub
    }

    public TestBoolean(boolean isSucc, String msg) {
	    super();
	    this.isSucc = isSucc;
	    this.msg = msg;
    }
  
    public boolean isSucc() {
    	return isSucc;
    }

    public void setSucc(boolean isSucc) {
    	this.isSucc = isSucc;
    }

    public String getMsg() {
    	return msg;
    }

    public void setMsg(String msg) {
    	this.msg = msg;
    }
}

注意TestBoolean中属性isSucc的setter方法。

测试方法如下所示:

@Test
	public void test() {
		String json = "{isSucc: true,msg: 'This is msg property!'}";
	    JSONObject jsonObj = JSONObject.fromObject( json ); 
	    TestBoolean bean = (TestBoolean)JSONObject.toBean( jsonObj, TestBoolean.class );
	    System.out.println(bean.isSucc());
	    assertEquals(true, bean.isSucc());
	}

 这时junit测试会通不过,报告一个failure,同进控制台打印出了false. 这是因为TestBoolean这个类属性isSucc的setter方法并不是setIsSucc,而是setIsSucc,所以转化Bean时,它会根据你传入的属性名是isSucc,值是true;所以它会去查询setIsSucc方法给isSucc赋值,它没有找到setIsSucc这个方法,所以就没法给isSucc赋值;如果你将你的json对象改成succ:true;再进行测试,此测试就会成功了,并且控制台打印出了true。如下所示:

String json = "{succ: true,msg: 'This is msg property!'}";

 或者你不修改json字符串,你可以只修改isSucc属性的setter方法,改成setIsSucc,测试程序同样可以运行成功。

你将TestBoolean中的boolean属性改成Boolean,效果将是一样的。如下所示:

public class TestBoolean {

	private Boolean	succ;
	private String	msg;

	public TestBoolean() {
		super();
		// TODO Auto-generated constructor stub
	}

	public TestBoolean(Boolean succ, String msg) {
		super();
		this.succ = succ;
		this.msg = msg;
	}

	public Boolean getSucc() {
		return succ;
	}

	public void setSucc(Boolean succ) {
		this.succ = succ;
	}
......
}

 测试程序还是像上面所示,只是将json字符串修改成

String json = "{succ: true,msg: 'This is msg property!'}";
3
1
分享到:
评论
2 楼 naoda 2010-08-26  
写的很不错,受益匪浅。
1 楼 ihibernate 2010-06-24  
不错

相关推荐

    json-lib 学习笔记 分享下

    这个学习笔记主要围绕`json-lib`的使用方法和关键特性进行阐述。 首先,`json-lib`支持多种Java对象到JSON的转换,包括基本类型、数组、集合、Map以及自定义的Java类。例如,你可以通过以下方式将一个HashMap转换为...

    《JSON-lib框架,转换JSON、XML不再困难》学习笔记

    3. JSON对象与JSON数组的创建:学习笔记可能介绍如何使用JSON-lib创建JSON对象和数组。例如,你可以通过`net.sf.json.JSONObject`和`net.sf.json.JSONArray`类来实现。 4. Java对象转换为JSON:JSON-lib提供了`...

    json 学习笔记_20140116.pdf

    在本文档《json 学习笔记_***.pdf》中,主要介绍了在Java开发中,如何使用三个常用的JSON处理工具:struts json,json_lib,jackson-mapper。同时,也提到了在使用这些工具时可能遇到的一些常见错误及其处理方法。 ...

    JSON学习笔记

    这篇"JSON学习笔记"可能涵盖了以下几个关键知识点: 1. JSON的基本结构:JSON数据由键值对(key-value pairs)组成,键和值之间用冒号隔开,键值对之间用逗号分隔。键必须是字符串,而值可以是字符串、数字、布尔值...

    vue学习笔记,B站黑马程序员的javaweb

    Vue学习笔记 Vue是一个基于JavaScript的渐进式框架,用于构建用户界面。下面是关于Vue的学习笔记。 一、Vue基本知识 在Vue中,以点vue结尾的文件称为组件文件,包含三部分:template、script、style。template是...

    Ext学习笔记-个人版.doc

    在Java中,处理JSON数据需要引入相关的库,如`json-lib`,并且要确保所有依赖的JAR文件都已正确添加。在Java代码中,可以使用`JSONArray`和`JSONObject`类将Java对象转换为JSON字符串: 1. `ArrayList`转换为`...

    girl项目学习笔记1

    ### Girl项目学习笔记1 #### 一、Spring Boot项目初始化与Maven镜像更换 **1.1 更换IDEA内置Maven镜像至阿里云中央仓库** 在启动Spring Boot项目之前,首先需要确保开发环境配置正确。对于使用IntelliJ IDEA作为...

    src & lib.zip

    标题“src & lib.zip”指的是一个包含Java Web开发中源代码(src)和库文件(lib)的...通过阅读文档、参考示例项目、完成练习,以及理解和应用src和lib中的代码,学习者能够逐步掌握Java EE平台的关键技术和开发流程。

    Apache_cxf_学习笔记.docx

    ### Apache CXF 学习笔记知识点汇总 #### 一、CXF简介 ##### 1.1 CXF概述 - **背景介绍**:Apache CXF 是一个高性能、功能丰富的开源框架,用于构建和消费 Web 服务。它融合了 Celtix 和 XFire 两个开源项目的...

    Android随手笔记44之JSON数据解析

    在Android开发中,JSON数据解析是一项重要的技能,它涉及到如何处理服务器端返回的数据以及如何在客户端展示这些数据。...通过不断实践和学习,开发者可以更好地利用JSON进行数据交换,提高应用的效率和用户体验。

    struts学习笔记

    - **lib**:包含所有必要的JAR文件。 - **src**:包含源代码。 #### 二、Struts2框架开发步骤 **1. 搭建开发环境**: - **获取框架JAR文件**: - **Struts2核心库**:struts2.0-core.jar - **第三方依赖**:...

    Java中jqGrid 学习笔记整理——进阶篇(二)

    在本篇Java中jqGrid的学习笔记整理中,我们将聚焦于jqGrid与后台Java服务的数据交互。jqGrid是一款强大的JavaScript库,用于创建动态、交互式的表格,而这里的进阶篇(二)将涉及到如何通过Java后端来提供数据支持。 ...

    学习笔记(12):21天搞定分布式Python网络爬虫-urllib库-Cookie原理讲解

    本篇学习笔记将深入讲解Cookie的工作原理以及在`urllib`库中的应用。 Cookie是一种小型文本文件,由服务器发送到用户的浏览器,并由浏览器保存。它的主要用途是识别用户身份、维持会话状态,比如当你登录某个网站后...

    solr学习心得和总结笔记

    【Solr学习心得与总结笔记】 一、站内搜索的技术选型 站内搜索的实现方式多样,但针对不同需求,技术选型有所不同: 1. 使用Lucene:Lucene是Java开发的全文检索库,提供了底层的搜索算法,但直接使用Lucene需要...

    jggrid资料

    3. **jqgrid学习笔记网搜和个人经验1.pdf**:作者通过网络搜集和自己的实践,整理出的学习笔记,包含了常见问题解决方案和实践经验分享,对于初学者极具参考价值。 **总结** jgGrid作为一个强大的JavaScript表格...

    android 入门笔记

    Android入门笔记 1. 开发环境配置 在开始Android开发之前,首先需要配置好开发环境。Eclipse是一款经典的集成开发环境(IDE),适用于Android开发。你可以从以下地址下载Eclipse: - Eclipse下载地址:此处应填写...

    个人的ajax的资料

    【描述】: "这份资料集合是关于个人学习AJAX的心得,虽然较为初级且未经过系统的整理,但包含了我学习过程中的笔记和实例,适合初学者入门。" 【标签】: "比较杂乱" 在这些文档和资源中,我们可以提取出以下几个...

    python 3.6 tkinter+urllib+json实现火车车次信息查询功能

    一、概述 妹子工作时需要大量地查询火车车次至南京的信息,包括该车次到达站(南京站or...python+tkinter实现界面,详见之前的学习笔记://www.jb51.net/article/131059.htm 最终效果图: 二、实现 1.界面读取待查询

Global site tag (gtag.js) - Google Analytics