【攻克Android (40)】JSON解析

[b][size=large]本文围绕以下三个部分展开: [/size][/b]

[b][size=large]一、JSON解析[/size][/b]
[b][size=large]二、Gson[/size][/b]
[b][size=large]三、Fast-json[/size][/b]


[b][size=large]一、JSON解析[/size][/b]

[size=medium][b]1. 基本概念[/b][/size]

[size=medium]JSON: JavaScript Object Notation,是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。[/size]

[size=medium]它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。[/size]

[size=medium]JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。它通用于C, C++, C#, Java, JavaScript, Perl, Python, PHP等编程语言的数据交换传输。[/size]


[size=medium][b]2. JSON基本结构[/b][/size]

[size=medium][b](1)[/b]对象[/size]

[size=medium]名值对的集合(A collection of name/value pairs)。[/size]

[size=medium]一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号)。名值对之间使用“,”(逗号)分隔。[/size]

var myobj ={"name":"Tom","age":20};


[size=medium][b](2)[/b]数组[/size]

[size=medium]值的有序列表(An ordered list of values)。[/size]


[size=medium][b]3. JSON具有以下这些形式:[/b]对象 (object)、数组 (array)、值 (value)、字符串(string)、数值 (number)。[/size]


[b][size=large]JSON解析案例[/size][/b]

[size=medium]创建测试类:JsonTest,继承自InstrumentationTestCase类,用于单元测试。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0111/4498/291ed2c5-4e23-31b2-ac42-0a97456fce60.png[/img][/align]

package com.android.dataparsing;

import android.test.InstrumentationTestCase;

/**
* Created by Xiangdong on 2015/9/5.
*/
public class JsonTest extends InstrumentationTestCase {

}



[size=medium][b]1. 将 java对象 转化为 JSON 对象/数组[/b][/size]

package com.android.dataparsing;

import android.test.InstrumentationTestCase;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONObject;

/**
* Created by Xiangdong on 2015/9/5.
*/
public class JsonTest extends InstrumentationTestCase {
private static final String TAG = "MainActivity";

/**
* 将 java对象 转化为 JSON 对象/数组
*
* @throws Exception
*/
public void testObject2Json() throws Exception {
// 情况1:java对象 -> JSON对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "段誉");
jsonObject.put("age", 16);
// 输出:{"name":"段誉","age":16}
Log.v(TAG, jsonObject.toString());

// 情况2:JSON对象中嵌套JSON对象
JSONObject addressObj = new JSONObject();
addressObj.put("city", "长沙");
addressObj.put("street", "南阳街");
// 嵌套
jsonObject.put("address", addressObj);
// 输出:{"name":"段誉","age":16,"address":{"city":"长沙",""street","南阳街"}}
Log.v(TAG, jsonObject.toString());

// 情况3:java对象 -> JSON数组
JSONArray ja = new JSONArray();
ja.put("130");
ja.put("155");
ja.put("188");
// 输出:["130","155","188"]
Log.v(TAG, ja.toString());

// 情况4:JSON对象中嵌套JSON数组
jsonObject.put("phone", ja);
// 输出:{"name":"段誉","age":16,"address":{"city":"长沙","street":"南阳街"},"phone":["130","155","188"]}
Log.v(TAG, jsonObject.toString());
}
}


[align=center][img]http://dl2.iteye.com/upload/attachment/0111/4573/38044990-a0fc-34eb-8b2c-6745341b2f79.png[/img][/align]


[size=medium][b]2. JSON格式的字符串 转换为 JSON对象;JSON对象 转换为 字符串。[/b][/size]

package com.android.dataparsing;

import android.test.InstrumentationTestCase;
import android.util.Log;

import org.json.JSONObject;

/**
* Created by Xiangdong on 2015/9/5.
*/
public class JsonTest extends InstrumentationTestCase {
private static final String TAG = "MainActivity";

/**
* JSON格式的字符串 转换为 JSON对象;
* JSON对象 转换为 字符串
*
* @throws Exception
*/
public void testJson2Object() throws Exception {
String json = "{'name':'Tom','age':20}";
// 情况1:将 JSON格式的字符串 转为 JSON对象
JSONObject jsonObj = new JSONObject(json);
// 输出:{"name":"Tom","age":"20"} - 引号就没有了。
Log.v(TAG, jsonObj.toString());

// 情况2:将JSON对象转换为 字符串
String name = jsonObj.getString("name");
int age = jsonObj.getInt("age");
String text = String.format("%s,%d", name, age);
// 输出:String->JSON: Tom,20
Log.v(TAG, "JSON->String: " + text);
}
}


[align=center][img]http://dl2.iteye.com/upload/attachment/0111/4575/ae719824-1ef9-37c3-ae8f-181fcf7253b9.png[/img][/align]


[size=medium][b]3. JSON数组格式的字符串 转换为 JSON数组;JSON数组中的每一项 转换为 字符串。[/b][/size]

package com.android.dataparsing;

import android.test.InstrumentationTestCase;
import android.util.Log;

import org.json.JSONArray;

/**
* Created by Xiangdong on 2015/9/5.
*/
public class JsonTest extends InstrumentationTestCase {
private static final String TAG = "MainActivity";

/**
* JSON数组格式的字符串 转换为 JSON数组;
* JSON数组中的每一项 转换为 字符串
*
* @throws Exception
*/
public void testArray2Object() throws Exception {
String json = "[jack,tom,rose]";
JSONArray array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
String s = String.format("%s", array.get(i));
// jack
// tom
// rose
Log.v(TAG, s);
}
}
}


[align=center][img]http://dl2.iteye.com/upload/attachment/0111/4577/460a97fe-59e5-35ed-b8ce-e936d3576872.png[/img][/align]


[size=medium][b]4. 读取 JSON 格式的文本文件,并进行解析。[/b][/size]

[size=medium][b](1)[/b]先创建/导入 json.txt/json.json(是一个json格式 文本文件) 到 java目录下面。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0111/4581/79094dc7-4073-3c3c-adf8-4bda12eadfde.png[/img][/align]

[
{"name":"段誉","age":"16","sex":"男","address":"大理"},
{"name":"王语嫣","age":"17","sex":"女","address":"姑苏"},
{"name":"乔峰","age":"32","sex":"男","address":"契丹"},
{"name":"Tom","age":"20","sex":"M","address":"New York"}
]


[size=medium][b](2)[/b]将json.txt打包成jar包,并放到libs目录下,这样才能读取。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0111/4583/9316d61b-3d97-30ba-b0da-87b1a8a7db58.png[/img][/align]

[size=medium][b](3)[/b]读取 JSON 格式的文本文件,并进行解析。[/size]

package com.android.dataparsing;

import android.test.InstrumentationTestCase;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
* Created by Xiangdong on 2015/9/5.
*/
public class JsonTest extends InstrumentationTestCase {
private static final String TAG = "MainActivity";

/**
* 读取 JSON 格式的文本文件,并进行解析
*
* @throws Exception
*/
public void testReadFile() throws Exception {
// 读取文件到缓冲
InputStream in = getClass().getClassLoader()
.getResourceAsStream("json.txt");
// 用 BufferedReader 包装(因为要用文件的内容,因此要通过这个流去读)
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

// 情况1:文件内容 转换为 字符串
// 方法(1):使用 StringBuilder。
// StringBuilder 类似于 StringBuffer,用来拼接字符串
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
// json.txt文件的内容
String data = builder.toString();
Log.v(TAG, data);

// 方法(2):使用 String。
String s = "";
String line2;
while ((line2 = reader.readLine()) != null) {
s += line2;
}
// json.txt文件的内容
Log.v(TAG, s);


// 情况2:将JSON数组格式的字符串 转换为 JSON数组
JSONArray ja = new JSONArray(data);

// 情况3:从 JSON数组 中取出每个 JSON对象
for (int i = 0; i < ja.length(); i++) {
JSONObject jsonObj = ja.getJSONObject(i);

// 情况4:将 JSON对象 转换为 字符串
String name = jsonObj.getString("name");
String age = jsonObj.getString("age");
String sex = jsonObj.getString("sex");
String address = jsonObj.getString("address");

String text = String.format("%s,%s,%s,%s",
name, age, sex, address);
Log.v(TAG, text);
}
}
}


[align=center][img]http://dl2.iteye.com/upload/attachment/0111/4585/46d40d26-a31c-3db0-b9e2-1f72eb3fdc14.png[/img][/align]


[b][size=large]二、Gson[/size][/b]

[size=medium][b]1. 概念[/b][/size]

[size=medium]Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。[/size]

[size=medium]可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。[/size]

[size=medium]也可以通过Simple转换XML。[/size]


[size=medium][b]2. 特点[/b][/size]

[size=medium][b](1)[/b]快速、高效[/size]

[size=medium][b](2)[/b]代码量少、简洁[/size]

[size=medium][b](3)[/b]面向对象[/size]

[size=medium][b](4)[/b]数据传递和解析方便[/size]


[size=medium][b]3. jar和源码下载地址:[url]http://code.google.com/p/google-gson/downloads/list[/url][/b][/size]


[size=medium][b]4. 基本用法[/b][/size]

[size=medium][b](1)[/b]定义实体类[/size]

[size=medium][b](2)[/b]根据需要可以将JSON生成单个实体或列表实体集合[/size]


[b][size=large]Gson解析案例[/size][/b]


[size=medium][b]1. 将 gson-2.2.2.jar 包和 simple-xml-2.6.9.jar 包放到libs下面。[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0111/5065/8726b63a-de3f-359b-85d6-b1710d7955aa.png[/img][/align]


[size=medium][b]2. 在java目录下创建com.android.gson目录,里面创建三个类:Book、BookList和BookService。[/b][/size]

[size=medium][b](1)[/b]Book.java:[/size]

package com.android.gson;


import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

/**
* 创建1本书的pojo类。
*
*
* 对应的XML结构:
* <Book>
* <isbn>
* <title>
* <author>
* <image>
* </Book>
*
*
* Created by XiangdongLee on 2015/9/7
*/
@Root // 此处Root后面没有起名字,因此默认的根元素为:类名(Book)
public class Book {

@Element
private String isbn; // 编号

@Element
private String title;

@Element
private String author;

@Element(required = false) // 允许没有图片
private String image;

public Book() {
}

public Book(String isbn, String title, String author, String image) {
this.isbn = isbn;
this.title = title;
this.author = author;
this.image = image;
}

@Override
public String toString() {
return "Book [isbn=" + isbn + ", title=" + title + ", author=" + author
+ ", image=" + image + "]";
}

public String getIsbn() {
return isbn;
}

public void setIsbn(String isbn) {
this.isbn = isbn;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

public String getImage() {
return image;
}

public void setImage(String image) {
this.image = image;
}
}


[size=medium][b](2)[/b]BookList.java:[/size]

package com.android.gson;


import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

import java.util.LinkedList;

/**
* 创建多本书(集合)的pojo类。
*
*
* 对应的XML结构:
* <book-list>
* <Book>
* <isbn>
* <title>
* <author>
* <image>
* </Book>
*
* <Book>
* <isbn>
* <title>
* <author>
* <image>
* </Book>
* </book-list>
*
*
* Created by XiangdongLee on 2015/9/7
*/

@Root(name = "book-list") // 此处Root后面根元素重新起了名字,因此根元素名字为:book-list
public class BookList {

@ElementList(inline = true) // 元素列表
private LinkedList<Book> list;

public BookList() {
list = new LinkedList<Book>(); // 构造方法中创建出集合
}

public LinkedList<Book> getList() {
return list;
}

public void setList(LinkedList<Book> list) {
this.list = list;
}

public void addBook(Book book) {
list.add(book);
}

public int size() {
return list.size();
}

public void set(int index, Book element) {
list.set(index, element);
}

public Book get(int index) {
return list.get(index);
}

@Override
public String toString() {
return "BookList [list=" + list + "]";
}
}


[size=medium][b](3)[/b]BookService.java:[/size]

package com.android.gson;

/**
* Created by XiangdongLee on 2015/9/7
*/
public class BookService {
private static BookList list = new BookList();

// 放在 static静态块中:只要应用程序不结束,就一直存在
// 这些数据相当于来自数据库的数据
static {
list.addBook(new Book("9787506287081", "认识电影", "路易斯·贾内梯", "/images/1.jpg"));
list.addBook(new Book("9787513300711", "失控", "凯文·凯利", "/images/2.jpg"));
list.addBook(new Book("9787115293800", "算法", "Robert", "/images/3.jpg"));
list.addBook(new Book("9787544704007", "悲剧的诞生", "尼采", "/images/4.jpg"));
list.addBook(new Book("9787506285728", "社会学与生活", "理查德.谢弗", "/images/5.jpg"));
list.addBook(new Book("9787544707206", "万有引力之虹", "托马斯·品钦", "/images/6.jpg"));
list.addBook(new Book("9787229042066", "地球往事", "刘慈欣", "/images/7.jpg"));
list.addBook(new Book("9787229047221", "冰与火之歌", "乔治·马丁", "/images/8.jpg"));
}

public static BookList getBookList() {
return list;
}

public static void addBook(Book book) {
list.addBook(book);
}
}



[size=medium][b]3. 创建测试类:GsonTest,继承自InstrumentationTestCase类,进行单元测试。[/b][/size]

package com.android.dataparsing;

import android.test.InstrumentationTestCase;

import com.android.gson.Book;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.simpleframework.xml.core.Persister;

import java.lang.reflect.Type;
import java.util.List;

/**
* Created by XiangdongLee on 2015/9/7.
*/
public class GsonTest extends InstrumentationTestCase {
private static final String TAG = "MainActivity";
private Gson gson;
private Type bookListType;

private Persister persister;

/**
* 重写测试案例中的初始化方法:用来初始化 Gson
*
* @throws Exception
*/
@Override
protected void setUp() throws Exception {
gson = new Gson();
bookListType = new TypeToken<List<Book>>(){
}.getType();
persister = new Persister();
}
}



[size=medium][b]4. Gson解析[/b][/size]

[size=medium]使用 Gson 把 集合数据 转换为 json格式的字符串,然后再把 json格式的字符串 转换为 java对象。[/size]

package com.android.dataparsing;

import android.test.InstrumentationTestCase;
import android.util.Log;

import com.android.gson.Book;
import com.android.gson.BookList;
import com.android.gson.BookService;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.json.JSONArray;
import org.json.JSONObject;
import org.simpleframework.xml.core.Persister;

import java.lang.reflect.Type;
import java.util.List;

/**
* Created by XiangdongLee on 2015/9/7.
*/
public class GsonTest extends InstrumentationTestCase {
private static final String TAG = "MainActivity";
private Gson gson;
private Type bookListType;

private Persister persister;

/**
* 重写测试案例中的初始化方法:用来初始化 Gson
*
* @throws Exception
*/
@Override
protected void setUp() throws Exception {
gson = new Gson();
bookListType = new TypeToken<List<Book>>(){
}.getType();
persister = new Persister();
}

/**
* 使用 Gson 把 集合数据 转换为 json格式的字符串,
* 然后再把 json格式的字符串 转换为 java对象。
*/
public void testToJsonFromList() throws Exception{
BookList list = BookService.getBookList();
Log.v(TAG, list.toString());

// 情况1:使用 Gson 把集合数据转换为 json格式的字符串
String json = gson.toJson(list.getList(), bookListType);
Log.v(TAG,json);

// 情况2:使用 Gson把 json格式的字符串 转换为 java对象
Book book = gson.fromJson(json, Book.class);
// Book [isbn=9787506287081, title=认识电影, author=路易斯·贾内梯, image=/images/1.jpg]
Log.v(TAG,book.toString());

// 情况2.1:也可以通过JSON把 json格式的字符串 转换为 json数组
JSONArray ja = new JSONArray(json);
for(int i=0;i<ja.length();i++){
// 拿到 json对象中的 某一个值("title")。
JSONObject jsonObj = ja.getJSONObject(i);
// Log.v(TAG,jsonObj.toString());
Log.v(TAG,jsonObj.getString("title"));
}
}
}



[b][size=large]三、Fast-json[/size][/b]

[size=medium][b]1. 概念[/b][/size]

[size=medium]Fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。它具有极快的性能,宣称超越任其他的Java Json parser。[/size]


[size=medium][b]2. 特点[/b][/size]

[size=medium][b](1)[/b]快速:比其它任何基于Java的解析器和生成器更快,包括jackson。[/size]

[size=medium][b](2)[/b]强大:支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum。[/size]

[size=medium][b](3)[/b]零依赖:没有依赖其它任何类库除了JDK。[/size]

[size=medium][b](4)[/b]支持注解、支持全类型序列化。[/size]


[size=medium][b]3. 基本用法[/b][/size]

[size=medium][b](1)[/b]定义实体类[/size]

[size=medium][b](2)[/b]根据需要可以将JSON生成单个实体或列表实体集合[/size]


[b][size=large]Fast-json解析案例[/size][/b]

[size=medium][color=red]以后补充[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
08-10
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值