一. 什么是 JSON 数据类型 1. 在 JSON 中,值必须是以下数据类型之一
字符串
数字
对象(JSON对象)
数组
布尔
null
2. 在 JSON 中,值不可以是以下数据类型之一
3. JSON 的具体数据类型 ① JSON字符串:JSON 中的字符串必须用双引号包围。
② JSON数字:JSON 中的数字必须是整数或浮点数。
③ JSON对象:对象一定使用 { } 包着的。
1 2 3 { "employee" :{ "name" :"Bill Gates" , "age" :62 , "city" :"Seattle" } }
④ JSON数组:数组一定使用 [ ] 包着的。
1 2 3 { "employees" :[ "Bill" , "Steve" , "David" ] }
⑤ JSON布尔:JSON 中的值可以是 true/false。
⑥ JSON null:JSON 中的值可以是 null。
二. 解析JSON数据 1. 原生解析JSON ① 系统提供的关于JSON的类
② 实际例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 private void testJSONParse () { InputStream is = getResources().openRawResource(R.raw.json); String jsonString = getStringByInputStream(is); try { JSONObject jsonObject = new JSONObject(jsonString); User user = new User(); JsonModel jsonModel = new JsonModel(); { JSONObject user_json = jsonObject.getJSONObject("user" ); user.id = user_json.getLong("id" ); user.name = user_json.getString("name" ); user.avatar = user_json.getString("avatar" ); jsonModel.user = user; jsonModel.title = jsonObject.getString("title" ); jsonModel.content = jsonObject.getString("content" ); JSONArray images = jsonObject.getJSONArray("images" ); for (int i = 0 ; i < images.length(); i++) { jsonModel.images.add((String) images.get(i)); } jsonModel.block = jsonObject.getString("block" ); jsonModel.discussNumber = jsonObject.getString("discussNumber" ); jsonModel.datetime = jsonObject.getString("datetime" ); } System.out.println(jsonModel); } catch (JSONException e) { e.printStackTrace(); } } private String getStringByInputStream (InputStream is) { String result; ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte [] data = new byte [1024 ]; int len = 0 ; try { while ((len = is.read(data)) != -1 ){ bos.write(data,0 ,len); } } catch (IOException e) { e.printStackTrace(); } result = new String(bos.toByteArray()); return result; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class JsonModel { public User user; public String title; public String content; public List<String> images; public String block; public String discussNumber; public String datetime; public JsonModel () { images = new ArrayList<>(); } @Override public String toString () { return "JsonModel{" + "user=" + user + ", title='" + title + '\'' + ", content='" + content + '\'' + ", images=" + images + ", block='" + block + '\'' + ", discussNumber='" + discussNumber + '\'' + ", datetime='" + datetime + '\'' + '}' ; } }
③ 运行效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 JsonModel{ user=User{ id=1000001 , name='年少醉娇娆' , avatar='http://tp3.sinaimg.cn/5620612798/180/5733537191/0' }, title='请大家帮我掌掌眼~' , content='翻箱倒柜,找到40多枚民国铜币,请鉴赏下。' , images=[ http: http: http: ], block='古玩鉴赏' , discussNumber='101' , datetime='2015-12-10 09:40:02' }
2. 第三方库 GSON 解析 ① 使用 AndroidStudio 插件 GsonFormat 生成 JSON数据模型类
GsonFormat插件快捷调用:option + S。
使用步骤:
注意:
如果生成了内容类,会自动加上static标识。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 public class Bean { private UserBean user; private String title; private String content; private String block; private String discussNumber; private String datetime; private List<String> images; public UserBean getUser () { return user; } public void setUser (UserBean user) { this .user = user; } public String getTitle () { return title; } public void setTitle (String title) { this .title = title; } public String getContent () { return content; } public void setContent (String content) { this .content = content; } public String getBlock () { return block; } public void setBlock (String block) { this .block = block; } public String getDiscussNumber () { return discussNumber; } public void setDiscussNumber (String discussNumber) { this .discussNumber = discussNumber; } public String getDatetime () { return datetime; } public void setDatetime (String datetime) { this .datetime = datetime; } public List<String> getImages () { return images; } public void setImages (List<String> images) { this .images = images; } @Override public String toString () { return "Bean{" + "user=" + user + ", title='" + title + '\'' + ", content='" + content + '\'' + ", block='" + block + '\'' + ", discussNumber='" + discussNumber + '\'' + ", datetime='" + datetime + '\'' + ", images=" + images + '}' ; } public static class UserBean { private int id; private String name; private String avatar; 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 String getAvatar () { return avatar; } public void setAvatar (String avatar) { this .avatar = avatar; } @Override public String toString () { return "UserBean{" + "id=" + id + ", name='" + name + '\'' + ", avatar='" + avatar + '\'' + '}' ; } } }
② 使用第三方库 GSON
第三方库 GSON 的地址:GSON
简单的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 private void testJSONParseByGSON () { InputStream is = getResources().openRawResource(R.raw.json); String jsonString = getStringByInputStream(is); Gson gson = new Gson(); Bean bean = gson.fromJson(jsonString, Bean.class); System.out.println(bean); } private String getStringByInputStream (InputStream is) { String result; ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte [] data = new byte [1024 ]; int len = 0 ; try { while ((len = is.read(data)) != -1 ){ bos.write(data,0 ,len); } } catch (IOException e) { e.printStackTrace(); } result = new String(bos.toByteArray()); return result; }
③ 运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Bean{ user=UserBean{ id=1000001 , name='年少醉娇娆' , avatar='http://tp3.sinaimg.cn/5620612798/180/5733537191/0' }, title='请大家帮我掌掌眼~' , content='翻箱倒柜,找到40多枚民国铜币,请鉴赏下。' , block='古玩鉴赏' , discussNumber='101' , datetime='2015-12-10 09:40:02' , images=[ http: http: http: ] }
三. 源码地址 ParseJson
四. Fastjson 1. 简介 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
2. Github地址 FastJson
3. FastJson的简明教程 Fastjson 简明教程
参考文章 解析JSON数据的详细步骤以及偷懒技巧(使用第三方库GSON以及GsonFormat工具)