通俗地来说JSON 数据其实是String类型的数据。
可以通过创建Org 的JSONObject对象,获取一个属性值; 或者通过 Google提供的Gson 插件,转换成对应格式的Java对象 (JavaBean的形式),从而获得所需的数据.
这样就可以把你从网络上或者本地存储到Preference中的数据解析出来,非常方便。
一、JSON 的定义
1. 官网介绍
https://www.json.org/json-en.html
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate.
JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。人类易于阅读和书写。机器很容易解析和生成。
It is based on a subset of the JavaScript Programming Language Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language.
它基于JavaScript编程语言标准ECMA-262第三版(1999年12月)的子集 。JSON是一种完全独立于语言的文本格式,但是使用C语言家族(包括C,C ++,C#,Java,JavaScript,Perl,Python等)的程序员熟悉的约定。这些属性使JSON成为理想的数据交换语言。
2. 参考bejson 网站对JSON 的解释:
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。
那么,JSON到底是什么?
JSON就是一串字符串, 只不过元素会使用特定的符号标注。
- {} 双括号表示对象
- [] 中括号表示数组
- "" 双引号内是属性或值
- : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象
而[{"name": "Michael"},{"name": "Jerry"}]就表示包含两个对象的数组
当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有一个name数组的对
二、如何解析JSON数据
参考: https://stackoverflow.com/questions/2591098/how-to-parse-json-in-java
1. Google Gson 库
2. Org Json
3. Jackson
据说使用Jackson效率最高
三、使用问题
1. 无法导入JsonObject
Android studio 中, 在libs 加入gson-2.3.1
2. Json 格式化及转换成JavaBean 在线网站
https://www.bejson.com/json2javapojo/
3. 解析Json数据 (转换成Java对象时)报错
: IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY
AndroidRuntime: Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
解决方案参考(相对靠谱):
https://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin-array
部分内容如下:
https://github.com/google/gson/blob/master/UserGuide.md
This will work:
ChannelSearchEnum[] enums = gson.fromJson(yourJson, ChannelSearchEnum[].class);
But this is better:
Type collectionType = new TypeToken<Collection<ChannelSearchEnum>>(){}.getType();
Collection<ChannelSearchEnum> enums = gson.fromJson(yourJson, collectionType);