java中常见的json解析⽅法、库以及性能对⽐
常见的json解析有原⽣的JSONObject和JSONArray⽅法,⾕歌的GSON库,阿⾥的fastjson,还有jackson,json-lib。
Gson(项⽬地址:
FastJson(项⽬地址:
Jackson(项⽬地址:
Json-lib(项⽬地址:不好的地⽅确实是依赖于很多第三⽅包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-
1.1.1.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,⽐如⼀个类⾥⾯会出现另⼀个类的list或者map集合,json-lib从json到bean的转换就会出现
问题。json-lib在功能和性能上⾯都不能满⾜现在互联⽹化的需求。
1、java⽅法解析
JSONObject解析json对象
JSONArray解析json数组
例如json字符串为:
{
"personData": [
{
"age": 12,
"name": "nate",
"schoolInfo": [
{
"School_name": "清华"
},
{
"School_name": "北⼤"
}
],
"url": "sky/uploadImages/2014/345/36/E8C039MU0180.jpg"
},
{
"age": 24,
"name": "jack",
···
}
],
"result": 1
}
分析这段json数据,
第⼀层是⼀个花括号括号,即jsonObect对象,然后这个对象⾥⾯有⼀个personData的JSONArray数组,以及⼀个result属性
第⼆层personData的JSONArray数组,它⾥⾯除了属性之外,还有⼀个schoolInfo的JSONArray数组
第三次是schoolInfo的JSONArray数组⾥⾯的JSONObject对象
解析:
public class Httpjson extends Thread {
private String url;
private Context context;
private ListView listView;
private JsonAdapter adapter;
private Handler handler;
public Httpjson(String url, ListView listView, JsonAdapter adapter, Handler handler) {
super();
this.url = url;
this.listView = listView;
this.adapter = adapter;
this.handler = handler;
}
@Override
public void run() {
URL httpUrl;
try {
httpUrl = new URL(url);
···
}
/**
* 从⽹络中获取JSON字符串,然后解析
* @param json
* @return
*/
private List<Person> jsonParse(String json) {
try {
List<Person> personlist = new ArrayList<Person>();
JSONObject jsonObject = new JSONObject(json);
int result = Int("result");
if (result == 1) {
JSONArray jsonArray = JSONArray("personData");
for (int i = 0; i < jsonArray.length(); i++) {
Person person = new Person();
JSONObject personData = JSONObject(i);
int age = Int("age");
String url = String("url");
String name = String("name");
···
JSONArray schoolInfoArray = JSONArray("schoolInfo");
for (int j = 0; j < schoolInfoArray.length(); j++) {
JSONObject schoolInfojson = JSONObject(j);
String schoolName = String("School_name");
···
}
···
}
return personlist;
} else {
Toast.makeText(context, "erro", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
Log.e("JsonParseActivity", "json解析出现了问题");
}
return null;
}
}
2、gson解析
(1)简介
GSON是Google提供的⽤来在Java对象和JSON数据之间进⾏映射的Java类库。可以将⼀个Json字符转成⼀个Java对象,或者将⼀个Java转化为Json字符串。
(2)特点
快速、⾼效
代码量少、简洁
⾯向对象
数据传递和解析⽅便
(3)编写bean类
要写出能让gson使⽤的bean类,其中的key也就是名字,如date、safe这些必须⼀⼀对应起来。其次就是在bean类中,遇到花括号就写⼀个class类,遇到⽅括号就写⼀个Arraylist数组。这些就是主要规则了!内部的class类写成内部内的形式。
内部嵌套的类必须是static的,要不然解析会出错;
类⾥⾯的属性名必须跟Json字段⾥⾯的Key是⼀模⼀样的;
内部嵌套的⽤[]括起来的部分是⼀个List,所以定义为 public List b,⽽只⽤{}嵌套的就定义为 public C c,
{
"date": "2014-04-23",
···
"name": "蘑菇街",
"packageName": "ujie",
"safe": [
{
"safeDes": "已通过安智市场官⽅认证,是正版软件",
···
},
{
"safeDes": "已通过安智市场安全检测,请放⼼使⽤",
···
},
{
"safeDes": "⽆任何形式的⼴告",
·
··
}
],
"screen": [
"ujie/screen0.jpg",
···
],
"size": 6746678,
···
}
public class GsonParseMoGuBean {
public String data;
public String name;
public String packageName;
···
public ArrayList<SafeInfo> safe;
public class SafeInfo {
public String safeDes;
···
}
public ArrayList<String> screen;
}
(4)将json格式的字符串{}解析为java对象
Java对象
/**
* //将json格式的字符窜{}转换为java对象
*/
private void jsonToJavaObjectByGson() {
//1获取或创建json数据
String json ="{\n" +
"\t\"id\":2, \"name\":\"⼤虾\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" +
"}\n";
//2解析json数据
Gson gson =new Gson();
//第⼀个参数是要解析的数据,第⼆个参数是解析⽣成的java对象的类
ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
}
(5)将json格式的字符串{}解析为java对象的list
private void jsonToJavaListByGson() {
//1获取或创建json数据
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"192.168.10.165:8080/f1.jpg\",\n" +
" \"name\": \"⼤虾 1\",\n" +
" \"price\": 12.3\n" + " },\n" + " {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"192.168.10.165:8080/f2.jpg\",\n" +
" \"name\": \"⼤虾 2\",\n" +
" \"price\": 12.5\n" + " }\n" +
"]";
//2解析json数据
Gson gson =new Gson();
/
/List<ShopInfo>:是要返回数据的集合
List<ShopInfo> shops = gson.fromJson(json,new TypeToken<List<ShopInfo>>(){}.getType()); //3显⽰数据
tv_gson_orignal.setText(json);
tv_gson_last.String());
}
(6)将java对象转换为json字符串
private void javaToJSONByGson() {
//1获取或创建java数据
ShopInfo shopInfo = new ShopInfo(1,"鲍鱼",250.0,"baoyu");
//2⽣成json数据
Gson gson = new Gson();
String json = Json(shopInfo);
//3显⽰数据
tv_gson_orignal.String());
tv_gson_last.setText(json);
}
(7)将java对象的list转换为json字符串[]
/**
* //将java对象的list转换为json字符窜
*/
private void javaToJSONArrayByGson() {
//1获取或创建java数据
List<ShopInfo> shops =new ArrayList<ShopInfo>();
ShopInfo baoyu = new ShopInfo(1,"鲍鱼",250.0,"baoyu");
ShopInfo longxia = new ShopInfo(1,"龙虾",250.0,"longxia");
shops.add(baoyu);
shops.add(longxia);
//2⽣成json数据
Gson gson = new Gson();
String json = Json(shops);
//3显⽰数据
tv_gson_orignal.String());
tv_gson_last.setText(json);
}
3、fastjson
(1)简介
在⽇常的java项⽬开发中,JSON的使⽤越来越频繁,对于Json的处理⼯具也有很多。接下来就介绍⼀下阿⾥开源的⼀个⾼性能的JSON框架FastJson,功能完善,完全⽀持标准JSON库,现在已经越来越受到开发者的青睐。
(2)特点
Fastjson 是⼀个 Java 语⾔编写的⾼性能功能完善的 JSON 库。它采⽤⼀种“假定有序快速匹配”的算法,把JSONParse的性能提升到极致,是⽬前Java语⾔中最快的JSON库。
(4)将 json 格式的字符串{}转换为 Java 对象
private void jsonToJavaObjectByFastJson() {
// 1 获取或创建 JSON 数据
String json = "{\n" +
"\t\"id\":2, \"name\":\"⼤虾\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"192.168.10.165:8080/L05_Server/images/f1.jpg\ "\n" +
"}\n";
// 2 解析 JSON 数据
ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);
}
(4)将 json 格式的字符串[]转换为 Java 对象的 List
private void jsonToJavaListByFastJson() {
// 1 获取或创建 JSON 数据
String json = "[\n" +
" {\n"+
" \"id\": 1,\n" +
" \"imagePath\":
\"192.168.10.165:8080/f1.jpg\",\n" +
" " " " " "
\"name\": \"⼤虾 1\",\n" +
\"price\": 12.3\n" + },\n" +
{\n"+
\"id\": 2,\n" + \"imagePath\":
\"192.168.10.165:8080/f2.jpg\",\n" +
" \"name\": \"⼤虾 2\",\n" +
" \"price\": 12.5\n" + " }\n"+
"]";
// 2 解析 JSON 数据
List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);
}
(5)将 Java 对象转换为 json 字符串
private void javaToJsonObjectByFastJson() {
// 1 获取 Java 对象
ShopInfo shopInfo = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
// 2 ⽣成 JSON 数据
String json = JSONString(shopInfo);
// 3 数据显⽰ tv_fastjson_orignal.String()); tv_fastjson_last.setText(json);
}
(7)将 Java 对象的 List 转换为 json 字符串[]
private void javaToJsonArrayByFastJson() {
// 1 获取 Java 集合
List<ShopInfo> shops = new ArrayList<>();
ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
ShopInfo longxia = new ShopInfo(2, "龙虾", 251.0, "longxia"); shops.add(baoyu);
shops.add(longxia);
// 2 ⽣成 JSON 数据
String json = JSONString(shops);
// 3 数据显⽰ tv_fastjson_orignal.String()); tv_fastjson_last.setText(json);
}
4、性能对⽐
选择⼀个合适的JSON库要从多个⽅⾯进⾏考虑:
字符串解析成JSON性能
字符串解析成JavaBean性能
JavaBean构造JSON性能
集合构造JSON性能
易⽤性
编写性能测试
接下来开始编写这四个库的性能测试代码。
(1)添加maven依赖
当然⾸先是添加四个库的maven依赖,公平起见,我全部使⽤它们最新的版本:
<!-- Json libs-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId&le.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.4</version>
</dependency>
(2)四个库的⼯具类
java FastJsonUtil.java
public class FastJsonUtil { public static String bean2Json(Object obj) { JSONString(obj); } public static <T> T json2Bean(String jsonStr, Class<T> objClass) {
return JSON.parseObject(jsonStr, objClass);
}
}
java GsonUtil.java
public class GsonUtil {
private static Gson gson = new GsonBuilder().create();
public static String bean2Json(Object obj) {
Json(obj);
}
public static <T> T json2Bean(String jsonStr, Class<T> objClass) {
return gson.fromJson(jsonStr, objClass);
}
public static String jsonFormatter(String uglyJsonStr) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(uglyJsonStr);
Json(je);
}
}
java JacksonUtil.java
public class JacksonUtil { private static ObjectMapper mapper = new ObjectMapper();
public static String bean2Json(Object obj) {
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
安卓在线解析json}
}
public static <T> T json2Bean(String jsonStr, Class<T> objClass) {
try {
adValue(jsonStr, objClass);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
java JsonLibUtil.java
public class JsonLibUtil {
public static String bean2Json(Object obj) {
JSONObject jsonObject = JSONObject.fromObject(obj);
String();
}
@SuppressWarnings("unchecked")
public static <T> T json2Bean(String jsonStr, Class<T> objClass) {
return (T) Bean(JSONObject.fromObject(jsonStr), objClass);
}
}
(3)准备Model类
这⾥我写⼀个简单的Person类,同时属性有Date、List、Map和⾃定义的类FullName,最⼤程度模拟真实场景。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论