1.JSON객체 소개
JSONObject-lib 패키지는 Bean, 컬렉션, 맵, Java 배열, xml을 JSON으로 변환하기 위한 패키지입니다.
2. jar 패키지 다운로드
http://files.cnblogs.com/java-pan/lib.rar
JSONObject의 jar에 의존하는 6개의 다른 jar 패키지, 총 7개의 jar 파일을 제공합니다.
참고: 직장에서 프로젝트에 사용된 버전은 1.1이며, 이는 jdk1.3 버전에 해당하므로 이 블로그는 1.1 버전을 기준으로 작성되었습니다.
이 버전에 해당하는 javadoc 다운로드 경로는 다음과 같습니다. http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-1.1/
최신 버전은 2.4입니다. 기타 버전의 다운로드 주소는 http://sourceforge.net/projects/json-lib/files/json-lib/
입니다.3. 프로젝트 환경:
시스템: WIN7 myeclipse: 6.5 tomcat: 5.0 JDK: 개발 환경과 컴파일 모두 1.5 사용
프로젝트 구성은 다음과 같습니다.
참고: 이번에 사용한 파일은 프로젝트 디렉터리의 json 패키지에 있는 JSONObject_1_3 클래스와 note.txt뿐입니다
1.1 기반의 4.class&method API
다음과 같은 계약을 체결하세요.
1. JSONObject 1.1 기반 API 소개
2. 자주 사용되는 클래스와 메소드만 소개
3. 이 버전은 더 이상 권장되지 않습니다.
4. 소개된 클래스와 메소드는 주로 본 블로그에서 사용된 클래스와 메소드를 중심으로 작성되었습니다
JSONObject:A JSONObject is an unordered collection of name/value pairs.
은 최종 클래스이며 Object를 상속하고 JSON 인터페이스를 구현합니다.
시공방법은 다음과 같습니다.
JSONObject(); 빈 JSONObject 객체 생성
JSONObject(boolean isNull); 비어 있는지 여부에 관계없이 JSONObject 객체를 생성합니다
일반적인 방법은 다음과 같습니다.
fromBean(Object bean); 정적 메소드, pojo 객체를 통해 JSONObject 객체를 생성합니다
fromJSONObject(JSONObject 객체); 정적 메서드, 다른 JSONObject 객체를 통해 JSONObject 객체를 생성합니다
fromJSONString(JSONString string); 정적 메소드, JSONString을 통해 JSONObject 객체를 생성합니다
toString(); JSONObject 객체를 json 형식 문자열로 변환
iterator()는 요소를 순회하기 위해 Iterator 객체를 반환합니다.
다음은 몇 가지 put/get 메소드입니다. API는 다음과 같이 설명됩니다.
get 메소드는 값을 찾을 수 있으면 값을 반환하고, 값을 찾을 수 없으면 예외를 발생시킵니다. opt 메소드는 예외를 발생시키는 대신 기본값을 반환하므로 선택적 값을 얻는 데 유용합니다.
JSONArray:JSONArray는 순서가 지정된 값 시퀀스입니다.
은 최종 클래스이며 Object를 상속하고 JSON 인터페이스를 구현합니다.
시공방법은 다음과 같습니다.
JSONArray()는 빈 JSONArray 객체를 생성합니다
일반적인 방법은 다음과 같습니다.
fromArray(Object[] array); 정적 메소드, Java 배열을 통해 JSONArray 객체를 생성합니다fromCollection(Collection collection); 정적 메소드, 컬렉션 객체를 통해 JSONArray 객체를 생성합니다
fromString(String string); 정적 메소드, json 형식 문자열에서 JSONArray 객체를 구성합니다
toString(); JSONArray 객체를 json 형식 문자열로 변환
iterator()는 요소를 순회하기 위해 Iterator 객체를 반환합니다.
다음 단계도 put/get 메소드입니다...
XMLSerializer:JSON을 XML로 변환하는 유틸리티 클래스
Object를 상속받은 클래스
시공방법은 다음과 같습니다.
XMLSerializer(); XMLSerializer 객체 생성
일반적인 방법은 다음과 같습니다.
setRootName(String rootName); 변환된 xml의 루트 요소 이름을 설정합니다setTypeHintsEnabled(boolean typeHintsEnabled) 각 요소에 유형 속성이 표시되는지 여부 설정
write(JSON json); json 객체를 xml로 변환합니다. 기본 문자 인코딩은 UTF-8입니다.
인코딩 설정이 필요한 경우 write(JSON json, String 인코딩)을 사용하면 됩니다
5. XML 및 JSON 문자열의 각 열에 대한 간단한 예
JSON:
{"password":"123456","username":"张三"}
xml
<?xml version="1.0" encoding="UTF-8"?> <user_info> <password>123456</password> <username>张三</username> </user_info>
시작
프로젝트 이름이 JS인 새 웹 프로젝트를 만들고 다음 7개의 jar 패키지를 가져옵니다. 파일은 이전 준비 경로에서 다운로드됩니다.참고: 새 웹 프로젝트를 만들 필요는 없습니다. 일반 Java 프로젝트도 이 문서의 작업을 완료할 수 있습니다. json 패키지 외에 다른 6개 패키지를 import 해야하는 이유는 한눈에 알 수 있도록 마지막에 note.txt 를 올려드리겠습니다.
질문1: 프런트엔드에서 수신한 json 형식 문자열을 백그라운드에서 어떻게 처리하나요?
public static void jsonToJAVA() { System.out.println("json字符串转java代码"); String jsonStr = "{\"password\":\"\",\"username\":\"张三\"}"; JSONObject jsonObj = JSONObject.fromString(jsonStr); String username = jsonObj.getString("username"); String password = jsonObj.optString("password"); System.out.println("json--->java\n username=" + username + "\t password=" + password); }
question2:后台是怎么拼装json格式的字符串?
public static void javaToJSON() { System.out.println("java代码封装为json字符串"); JSONObject jsonObj = new JSONObject(); jsonObj.put("username", "张三"); jsonObj.put("password", ""); System.out.println("java--->json \n" + jsonObj.toString()); }
question3:json格式的字符串怎么转换为xml格式的字符串?
public static void jsonToXML() { System.out.println("json字符串转xml字符串"); String jsonStr = "{\"password\":\"\",\"username\":\"张三\"}"; JSONObject json = JSONObject.fromString(jsonStr); XMLSerializer xmlSerializer = new XMLSerializer(); xmlSerializer.setRootName("user_info"); xmlSerializer.setTypeHintsEnabled(false); String xml = xmlSerializer.write(json); System.out.println("json--->xml \n" + xml); }
question4:xml格式的字符串怎么转换为json格式的字符串?
public static void xmlToJSON(){ System.out.println("xml字符串转json字符串"); String xml = "<?xml version=\".\" encoding=\"UTF-\"?><user_info><password></password><username>张三</username></user_info>"; JSON json=XMLSerializer.read(xml); System.out.println("xml--->json \n"+json.toString()); }
question5:javabean怎么转换为json字符串?
public static void javaBeanToJSON() { System.out.println("javabean转json字符串"); UserInfo userInfo = new UserInfo(); userInfo.setUsername("张三"); userInfo.setPassword(""); JSONObject json = JSONObject.fromBean(userInfo); System.out.println("javabean--->json \n" + json.toString()); }
question6:javabean怎么转换为xml字符串?
public static void javaBeanToXML() { System.out.println("javabean转xml字符串"); UserInfo userInfo = new UserInfo(); userInfo.setUsername("张三"); userInfo.setPassword(""); JSONObject json = JSONObject.fromBean(userInfo); XMLSerializer xmlSerializer = new XMLSerializer(); String xml = xmlSerializer.write(json, "UTF-"); System.out.println("javabean--->xml \n" + xml); }
完整的JSONObject_1_3.java代码如下:
JSONObject_1_3 package json; import net.sf.json.JSON; import net.sf.json.JSONObject; import net.sf.json.xml.XMLSerializer; public class JSONObject__ { public static void javaToJSON() { System.out.println("java代码封装为json字符串"); JSONObject jsonObj = new JSONObject(); jsonObj.put("username", "张三"); jsonObj.put("password", ""); System.out.println("java--->json \n" + jsonObj.toString()); } public static void jsonToJAVA() { System.out.println("json字符串转java代码"); String jsonStr = "{\"password\":\"\",\"username\":\"张三\"}"; JSONObject jsonObj = JSONObject.fromString(jsonStr); String username = jsonObj.getString("username"); String password = jsonObj.optString("password"); System.out.println("json--->java\n username=" + username + "\t password=" + password); } public static void jsonToXML() { System.out.println("json字符串转xml字符串"); String jsonStr = "{\"password\":\"\",\"username\":\"张三\"}"; JSONObject json = JSONObject.fromString(jsonStr); XMLSerializer xmlSerializer = new XMLSerializer(); xmlSerializer.setRootName("user_info"); xmlSerializer.setTypeHintsEnabled(false); String xml = xmlSerializer.write(json); System.out.println("json--->xml \n" + xml); } public static void javaBeanToJSON() { System.out.println("javabean转json字符串"); UserInfo userInfo = new UserInfo(); userInfo.setUsername("张三"); userInfo.setPassword(""); JSONObject json = JSONObject.fromBean(userInfo); System.out.println("javabean--->json \n" + json.toString()); } public static void javaBeanToXML() { System.out.println("javabean转xml字符串"); UserInfo userInfo = new UserInfo(); userInfo.setUsername("张三"); userInfo.setPassword(""); JSONObject json = JSONObject.fromBean(userInfo); XMLSerializer xmlSerializer = new XMLSerializer(); String xml = xmlSerializer.write(json, "UTF-"); System.out.println("javabean--->xml \n" + xml); } public static void xmlToJSON(){ System.out.println("xml字符串转json字符串"); String xml = "<?xml version=\".\" encoding=\"UTF-\"?>"; JSON json=XMLSerializer.read(xml); System.out.println("xml--->json \n"+json.toString()); } public static void main(String args[]) { // javaToJSON(); // jsonToJAVA(); // jsonToXML(); // javaBeanToJSON(); // javaBeanToXML(); xmlToJSON(); } } 张三
完整的UserInfo.java代码如下:
UserInfo package json; public class UserInfo { public String username; public String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
result
代码和运行结果都已经贴在每个问题的后面,运行时直接用main方法分别对每个方法运行即可看到测试效果。
note.txt是报的对应的错误及解决方法,也从另一个方面说明为什么需要导入前面提到的jar包;
note.txt文件内容如下:
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:537) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) at java.net.URLClassLoader.defineClass(URLClassLoader.java:251) at java.net.URLClassLoader.access$100(URLClassLoader.java:55) at java.net.URLClassLoader$1.run(URLClassLoader.java:194) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:187) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) at generate.TestJSONObject.main(TestJSONObject.java:40) Exception in thread "main"
解决方案:导入commons-lang-2.1.jar
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at net.sf.json.JSONObject.<clinit>(JSONObject.java:125) at generate.TestJSONObject.main(TestJSONObject.java:40) Exception in thread "main"
解决方案:导入commons-logging.jar
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean at net.sf.json.JSONObject.set(JSONObject.java:2164) at net.sf.json.JSONObject.put(JSONObject.java:1853) at net.sf.json.JSONObject.put(JSONObject.java:1806) at generate.TestJSONObject.main(TestJSONObject.java:41) Exception in thread "main"
解决方案:导入commons-beanutils.jar
java.lang.NoClassDefFoundError: net/sf/ezmorph/MorpherRegistry at net.sf.json.util.JSONUtils.<clinit>(JSONUtils.java:65) at net.sf.json.JSONObject.set(JSONObject.java:2164) at net.sf.json.JSONObject.put(JSONObject.java:1853) at net.sf.json.JSONObject.put(JSONObject.java:1806) at generate.TestJSONObject.main(TestJSONObject.java:41) Exception in thread "main"
解决方案:导入ezmorph-1.0.2.jar
java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap at org.apache.commons.beanutils.PropertyUtils.<clinit>(PropertyUtils.java:208) at net.sf.json.JSONObject.fromBean(JSONObject.java:190) at net.sf.json.JSONObject.fromObject(JSONObject.java:437) at net.sf.json.JSONObject.set(JSONObject.java:2196) at net.sf.json.JSONObject.put(JSONObject.java:1853) at net.sf.json.JSONObject.put(JSONObject.java:1806) at generate.TestJSONObject.main(TestJSONObject.java:41) Exception in thread "main"
解决方案:导入commons-collections-3.0.jar
Exception in thread "main" java.lang.NoClassDefFoundError: nu/xom/Serializer at generate.TestJSONObject.jsonToXML(TestJSONObject.java:88) at generate.TestJSONObject.main(TestJSONObject.java:96)
解决方案:导入xom-1.0d10.jar
几点说明:
1.注意UserInfo类的修饰符,用public修饰,变量username和password也用public修饰,最好单独的写一个类,这里就不贴出来了
2.以上json字符串和xml字符串都是最简单的形式,实际开发中json字符串和xml格式比这个复杂的多,
处理复杂的json字符串,可以封装写一个类继承HashMap,然后重写其put和get方法,以支持对类型为A[0].B及A.B的键值的读取和指定
3.以上6中情况在实际开发中可能有些不存在或不常用
存在的问题:
1.使用XMLSerializer的write方法生成的xml字符串的中文乱码问题
2.question4中的红色的log日志问题
以上内容是小编给大家介绍的JSONObject使用方法详解,希望大家喜欢。