1、定义:JSON全称(JavaScript Object Notation:javaScript的对象表示法),是一种轻量级的数据交换格式。
2、作用:数据标记、存储&传输。
3、特点:读写速度快、解析简单、轻量级、独立于语言和开发平台。
4、序列化:前面两篇文章讲的是狭义上的
对象序列化
:serializable(基于反射机制,适合数据IO磁盘操作和网络传输)、Parcelable(基于IBinder,适合内存的进程间数据传递);而JSON称为广义上的序列化,一种序列化的拓展:
数据序列化
二、JSON格式语法?
1、实例:1个JSON文件里含多个数据,这些数据 以
JSON
值 的形式存在
"name": "OrgJson",
"sex": "男",
"age": "23",
"courses": [
"name": "语文",
"score": 98
"name": "数学",
"score": 100
2、说明:一个
JSON
值的内容形式可以是:”
名称 - 值“对
、
数组
或
对象
,下面将详细说明
三、JSON的解析方式有哪几种?
1、Android studio自带的org.json解析方式
解析原理:基于文档驱动
解析流程:把全部文件读入到内存中 ->> 遍历所有数据 ->> 根据需要检索想要的数据
代码实战:手动生成一个JSON数据,在手动解析JSON数据。
(org.json:优点是自带的,不用引入依赖,体积小。不足的是没有一个将JSONObject对象直接转JavaBean的方法)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
createJson();//生成JSON数据,保存在手机目录
} catch (JSONException | IOException e) {
e.printStackTrace();
try {
parseJson();//解析JSON数据
} catch (IOException | JSONException e) {
e.printStackTrace();
private void createJson() throws JSONException, IOException {
File file = new File(getFilesDir(), "test.json");
//实例化一个JSONObject对象
JSONObject student = new JSONObject();
student.put("name", "OrgJson");
student.put("sex", "男");
student.put("age", "23");
JSONObject course1 = new JSONObject();
course1.put("name", "语文");
course1.put("score", 98);
JSONObject course2 = new JSONObject();
course2.put("name", "数学");
course2.put("score", 100);
//实例化一个JSON数组
JSONArray cources = new JSONArray();
//将course1添加到JSONArray,下标为0
cources.put(0, course1);
cources.put(1, course2);
student.put("courses", cources);
FileOutputStream fos = new FileOutputStream(file);
fos.write(student.toString().getBytes());
fos.close();
Log.i("Main", "json:" + student.toString());
private void parseJson() throws IOException, JSONException {
File file = new File(getFilesDir(), "test.json");
FileInputStream fis = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String line;
while (null != (line = br.readLine())) {
stringBuilder.append(line);
fis.close();
inputStreamReader.close();
br.close();
Log.i("Main", "name:" + stringBuilder.toString());
Student student = new Student();
JSONObject jsonObject = new JSONObject(stringBuilder.toString());
String name = jsonObject.optString("hobby");
// String name1 = jsonObject.getString("hobby");
//optString当json中没对应的key时,返回"",而getString会抛出异常
Log.i("Main", "name:" + name.length());
student.setName(jsonObject.optString("name",""));
student.setSex(jsonObject.optString("sex",""));
student.setAge(jsonObject.optString("age",""));
JSONArray jsonArray = jsonObject.optJSONArray("courses");
List<Student.CoursesBean> list = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
Student.CoursesBean bean = new Student.CoursesBean();
JSONObject jsonObject1 = (JSONObject) jsonArray.get(i);
bean.setName(jsonObject1.optString("name"));
bean.setScore(jsonObject1.optInt("score"));
list.add(bean);
student.setCourses(list);
Log.i("Main","parseJson " + student.toString());
public class Student {
* name : OrgJson
* sex : 男
* age : 23
* courses : [{"name":"语文","score":98},{"name":"数学","score":100}]
private String name;
private String sex;
private String age;
private List<CoursesBean> courses;
public String getName() {
return name;
public void setName(String name) {
this.name = name;
public String getSex() {
return sex;
public void setSex(String sex) {
this.sex = sex;
public String getAge() {
return age;
public void setAge(String age) {
this.age = age;
public List<CoursesBean> getCourses() {
return courses;
public void setCourses(List<CoursesBean> courses) {
this.courses = courses;
public static class CoursesBean {
* name : 语文
* score : 98
private String name;
private int score;
public String getName() {
return name;
public void setName(String name) {
this.name = name;
public int getScore() {
return score;
public void setScore(int score) {
this.score = score;
@Override
public String toString() {
return "CoursesBean{" +
"name='" + name + '\'' +
", score=" + score +
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
", courses=" + courses +
2、Gson解析
解析原理:基于事件驱动
解析流程:根据所需取的数据 建立1个对应于JSON
数据的JavaBean
类,即可通过简单操作解析出所需数据
具体使用:需要引入依赖库(2020.11.29的最新版本):
步骤一:引入最新Gson依赖库
implementation 'com.google.code.gson:gson:2.8.6'
步骤二:创建javaBean,一个与JSON数据对应的大的JavaBean类(可能内部有多个嵌套的JavaBean)
1、创建规则:
什么意思呢上面的规则,就是说如何根据JSON数据来生成一个JavaBean呢?其实已经有Android studio的插件来自动生成了:GsonFormat插件
2、GsonFormat插件的安装以及使用:
使用:新建一个User的JavaBean类:我的快捷键Alt+N出来个弹框,点击GsonFormat
这样一个JavaBean就生成好了。如下,然后我们在解释一下上面的这个规则:
注意:变量需要和上面的key对应上,你不想要解析的字段可以不用写进JavaBean中。一个{}就是一个Object:最外层的{}就是User这个JavaBean,里面还有嵌套的{"name":"语文","score":98}对应的是CoursesBean这个JavaBean。一个[]就对应一个数组。
package com.fengshows.day11_json.gsonTest;
import java.util.List;
* Date: 2020/11/29
* Author: SunBinKang
* Description:
public class User {
* name : OrgJson
* sex : 男
* age : 23
* translation : ["车","船"]
* courses : [{"name":"语文","score":98},{"name":"数学","score":100}]
private String name;
private String sex;
private int age;
private List<String> translation;
private List<CoursesBean> courses;
public String getName() {
return name;
public void setName(String name) {
this.name = name;
public String getSex() {
return sex;
public void setSex(String sex) {
this.sex = sex;
public int getAge() {
return age;
public void setAge(int age) {
this.age = age;
public List<String> getTranslation() {
return translation;
public void setTranslation(List<String> translation) {
this.translation = translation;
public List<CoursesBean> getCourses() {
return courses;
public void setCourses(List<CoursesBean> courses) {
this.courses = courses;
public static class CoursesBean {
* name : 语文
* score : 98
private String name;
private int score;
public String getName() {
return name;
public void setName(String name) {
this.name = name;
public int getScore() {
return score;
public void setScore(int score) {
this.score = score;
3、Gson如何序列化和反序列化呢?
序列化:将JavaBean对象转成json字符串。
反序列化:将json字符串转成JavaBean。
简单代码演示:新建一个简单的GsonBean类:
public class GsonBean {
public int age;
public String name;
@Override
public String toString() {
return "GsonBean{" +
"age=" + age +
", name='" + name + '\'' +
public class GsonTest {
public static void main(String[] args) {
Gson gson = new Gson();
GsonBean gsonBean = new GsonBean();
gsonBean.age= 2;
gsonBean.name = "str";
//序列化:将gsonBean对象转成json字符串了
String json = gson.toJson(gsonBean);
System.out.println("json: " + json);
//反序列化:将json字符串对象转成GsonBean了
GsonBean gsonBean1 = gson.fromJson(json,GsonBean.class);
System.out.println("gsonBean1: " + gsonBean1.toString());
执行结果:
三、Gson解析的拓展知识
1、几个常用的注解
@SerializedName("name1"):对象序列化成json字符串的时候修改名字
public int age;
@SerializedName("name1")
public String name;//给name字段加上了SerializedName注解
序列化结果:
@Since(1.0)/@Until(1.0)版本控制的作用,>=和<=才参与序列化
Gson gson = new GsonBuilder().setVersion(1.2).create();//可以这样创建Gson来设置当前解析的版本
2、自定义TypeAdapter解析数据。(两个关键的类JsonWriter和JsonReader)
public class GsonBeanAdapter extends TypeAdapter<GsonBean> {
@Override
public void write(JsonWriter out, GsonBean value) throws IOException {//将GsonBean对象解析为字符串
if (value == null) {//进行非空判断
out.nullValue();
return;
out.beginObject();
out.name("name").value(value.name);
out.name("age").value(value.age);
out.endObject();
@Override
public GsonBean read(JsonReader in) throws IOException {//将字符串转为JavaBean对象
if (in.peek() == JsonToken.NULL) {//进行非空判断
in.nextNull();
return null;
GsonBean gsonBean = new GsonBean();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "name":
gsonBean.name = in.nextString();
break;
case "age":
gsonBean.age = in.nextInt();
break;
in.endObject();
return gsonBean;
这样就会使用我们自定义的TypeAdapter来进行序列化和反序列化。如果没有设置,Gson源码就会使用反射的TypeAdapter来进行序列化和反序列化(会稍微耗性能)
一、JSON是什么?1、定义:JSON全称(JavaScript Object Notation:javaScript的对象表示法),是一种轻量级的数据交换格式。2、作用:数据标记、存储&传输。3、特点:读写速度快、解析简单、轻量级、独立于语言和开发平台。二、JSON格式语法?1、实例:1个JSON文件里含多个数据,这些数据 以JSON值 的形式存在{ "name": "OrgJson", "sex": "男", "age": "23",..
google-gson Gson是一个Java库,可用于将Java对象转换为其JSON表示形式。
它也可以用于将JSON字符串转换为等效的Java对象。
Gson可以使用任意Java对象Gson Gson是一个Java库,可用于将Java对象转换为其JSON表示形式。
它也可以用于将JSON字符串转换为等效的Java对象。
Gson可以处理任意Java对象,包括您没有源代码的预先存在的对象。
有一些开源项目可以将Java对象转换为JSON。
但是,大多数方法都要求您在类中放置Java批注。
如果您没有访问权限,则无法执行的操作
1Android Studio自带org.json解析
基于文档驱动 需要把全部文件读入到内存中 然后遍历所有数据,根据需要检索想要的数据
2 Gson 解析gson.toJson、gson.fromJson
基于事件驱动
根据所需取的数据 建立1个对应于JSON数据的JavaBean类,即可通过简单操作解析出所需数据
按需取数据
3,Jackson解析 ObjectMapper ..
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.text.SimpleDateF
前言今天,我们来介绍一下现今主流的数据交换格式-JSON!
同样作为主流为数据交换格式-XML,如果有兴趣可以阅读我写的XML及其DOM、SAX、PULL解析方法和对比
目录定义JavaScript Object Notation,JavaScript的对象表示法,是一种轻量级的文本数据交换格式。作用用于数据的标记、存储和传输。特点
轻量级的文本数据交换格式
独立于语言和平台
具有自我描述性
数据序列化的作用
可实现进程间通信,本地数据存储,网络数据传输等都需要实现序列化,但是由于应用场景不同,序列化的方式也不同,因为要考虑效率和使用难易的问题。序列化的目的其实简单来说就是想实现数据的传输。
序列化与反序列化
序列化:将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序...
序列化与反序列化
序列化:将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
反序列化:序列化的逆向操作,通过从存储区中读取对象的状态,重新创建该对象。
使用目的及场景
使对象持久化
一般情况下,只有当JVM处于运行时,java对象才可能存在,对象的生命周期不会比JVM的生命周期更长。但在现实应用中,存在JVM停止...
序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。
在Java中创建的对象,只要没有被回收就可以被复用,但是,创建的这些对象都是存在于JVM的堆内存中,JVM处于运行状态时候,这些对象可以复用,
但是一旦JVM停止,这些对象的状态也就丢失了。
在实际生活中,需要将对象持久化,需要的时候再重新读取出来,通过对象序列化,可以将对象的状态保存为字节数组,需要的时候再将字节数组反序列化为对...
1.jar包 <!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.2&a
android debug卡在waiting for debugger,显示Could not connect to remote process. Aborting debug session
37167