JSON数据格式优势解析:轻量高效的前后端数据传输格式详解

时间:2025-04-25作者:admin分类:Java教程浏览:13评论:0

在开发进程中,时常需要与其他系统进行数据交换。数据交换的格式包含 XML、JSON 等。JSON 作为一种轻量级的数据格式,其效率比 XML 要高。XML 需要大量的标签,这必然会占据网络流量。而 JSON 在这方面表现得较为出色。接下来先来看一下 JSON 的格式。

JSON数据格式优势解析:轻量高效的前后端数据传输格式详解

JSON 存在两种格式。其一为对象格式。其二为数组对象。

JSON 的对象格式的字符串,其名称为"JSON",地址是"北京市西城区",年龄是 25 岁。

有一个数据对象,其格式为 JSON,该对象位于北京市西城区,年龄为 25 岁。

从上面的两种格式能够看出,对象格式与数组对象格式唯一的差别在于,在对象格式的基础之上加上了中括号[]。接着来看具体的结构,就可以发现它们都是以键值对的形式呈现的,并且中间是用英文状态下的逗号(,)来进行分隔的。

在前端与后端进行数据传输之际,这种格式颇为受欢迎。后端会返回 json 格式的字符串,而前台则借助 js 中的 JSON.parse()方法,将 JSON 字符串解析为 json 对象,接着对其进行遍历,以便供前端使用。

下面开始介绍在 JAVA 里 JSON 与 java 对象之间的相互转换。

要实现 JSON 和 java 对象之间的互转,需借助第三方 jar 包。这里使用 json-lib 这个 jar 包,其下载地址为:。json-lib 需 commons-beanutils-1.8.0.jar、commons-collections-3.2.1.jar、commons-lang-2.5.jar、commons-logging-1.1.1.jar、ezmorph-1.0.6.jar 这五个包的支持,可自行从网上下载,此处不再贴出下载地址。

json-lib 提供了一些类能够完成此功能,比如 JSONObject 和 JSONArray。从这些类的名称能够推断出,JSONObject 转化的应当是对象格式的,而 JSONArray 转化的应当是数组对象(也就是带有[]形式的)。

一、java普通对象和json字符串的互转

java对象--》》字符串

java 普通对象指的是在 java 中存在的一个 java bean,也就是一个实体类。例如:

package com.cn.study.day3;
public class Student {
    //姓名
    private String name;
    //年龄
    private String age;
    //住址
    private String address;
    public String getName() {
        return name;
    }
这个方法用于设置名称。它接收一个字符串类型的参数 name,并将其设置为对象的名称。通过这个方法,可以方便地对对象的名称进行修改和设置。
        this.name = name;
    }
    public String getAge() {
        return age;
    }
将年龄进行设置,设置的内容为传入的字符串 age 。
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
将地址进行设置,设置的地址为传入的参数 address。
        this.address = address;
    }
    @Override
    public String toString() {
返回“学生[姓名=" + name + ",年龄=" + age + ",地址="
                + address + "]";
    }
    
}

我的一个普通的 java 实体类在上面。看看 json-lib 是怎样将它转化为字符串形式的。

公共静态 void 进行对象转换。
        
        Student stu=new Student();
        stu.setName("JSON");
        stu.setAge("23");
        stu.setAddress("北京市西城区");
        //1、使用JSONObject
使用 stu 创建了一个 JSONObject 对象 json ,这个 JSONObject 对象是通过 fromObject 方法从 stu 转换而来的 。
        //2、使用JSONArray
使用 stu 创建了一个 JSONArray 对象,该对象名为 array,是通过 JSONArray.fromObject(stu) 方法实现的。
        
将 json 转换为字符串的操作,得到的结果存储在字符串 strJson 中。
获取数组的字符串表示形式并赋值给字符串 strArray 。
        
System.out 输出 "strJson:" 与 strJson 进行拼接后的内容。
System 输出字符串 "strArray:" 与 strArray 进行拼接后的内容。
    }

我定义了一个名为 Student 的实体类。接着,分别运用了 JSONObject 和 JSONArray 这两种方式,将其转化为 JSON 字符串。接下来,请看打印出来的结果。

strJson 包含的信息为:其“address”是“北京市西城区”,“age”是“23”,“name”是“JSON”。
strArray 包含一个元素,该元素为一个字典,字典中包含三个键值对,其中一个键为"address",其值为"北京市西城区",一个键为"age",其值为"23",一个键为"name",其值为"JSON"。

从结果中能够看出,有两种方法都具备把 java 对象转化为 JSON 字符串的能力,并且只是转化之后的结构存在差异。

JSON字符串--》》java对象

上面说明了将 java 对象转化为 JSON 字符串的方法,接下来看把 JSON 字符串格式转化为 java 对象的情况。

首先要定义两种不同格式的字符串,并且要使用反斜杠对双引号进行转义。

公共静态 void 用于将 json 字符串转换为 Java 对象。 它主要用于处理在不同系统之间传递数据时,将 json 格式的数据转换为 Java 可识别和处理的对象形式。 这样可以方便在 Java 程序中对这些数据进行操作和处理。 例如,从网络请求中获取到的 json 数据,通过这个方法可以转换为 Java 对象,以便后续的业务逻辑处理。 它在前后端数据交互等场景中经常被使用。
        //定义两种不同格式的字符串
String 类型的 objectStr 等于 "{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"北京市西城区\"}";objectStr 中包含了名为"name"的值为"JSON",名为"age"的值为"24",名为"address"的值为"北京市西城区"的信息。
String 为字符串类型,arrayStr 被赋值为一个包含一个 JSON 对象的数组字符串。这个 JSON 对象的属性 "name" 的值为 "JSON",属性 "age" 的值为 "24",属性 "address" 的值为 "北京市西城区"。
    
        //1、使用JSONObject
通过 objectStr 生成了一个 JSONObject 对象,这个 JSONObject 对象就是 jsonObject,其生成方式是 JSONObject.fromObject(objectStr)。
通过 JSONObject 的 toBean 方法,将 jsonObject 转换为 Student 类的实例,赋值给 Student 类型的变量 stu 。
        
        //2、使用JSONArray
JSONArray 是通过 JSONArray.fromObject(arrayStr)的方式从 arrayStr 生成的。
        //获得jsonArray的第一个元素
        Object o=jsonArray.get(0);
使用 fromObject 方法将 o 转换为 JSONObject,得到 jsonObject2。
通过 JSONObject 的 toBean 方法,将 jsonObject2 转换为 Student 类的对象,得到 Student 类型的 stu2 。
System.out 输出了 "stu:" 与 stu 进行拼接后的内容。
System.out.println("学生 2:" + stu2);
        
    }

打印结果为:

学生的信息如下:姓名为 JSON,年龄是 24 岁,地址在北京市西城区。
学生名为 JSON,年龄 24 岁,地址在北京市西城区。

从上述代码能够得知,借助 JSONObject 能够便捷地将 JSON 格式的字符串转化为 java 对象。然而,使用 JSONArray 则并非如此容易,这是因为它带有“[]”符号。所以,在此我们在获取到 JSONArray 的对象之后,取出其第一个元素,该元素即为我们所需要的一个 student 的变形,接着再利用 JSONObject 轻松地获取到它。

二、list和json字符串的互转

list--》》json字符串

公共静态的 void 方法用于将列表转换为 JSON 格式。 此方法主要用于处理列表数据并将其转换为符合 JSON 规范的字符串形式。 它在处理数据转换方面具有特定的功能和用途。 可以通过调用此方法将各种列表数据转换为 JSON 数据。 此方法在相关的数据处理和交互场景中经常被使用。 它为处理列表与 JSON 之间的转换提供了便捷的方式。
        Student stu=new Student();
        stu.setName("JSON");
        stu.setAge("23");
        stu.setAddress("北京市海淀区");
        List lists=new ArrayList();
        lists.add(stu);
        //1、使用JSONObject
JSONObject 是通过将 lists 转换而来的,其具体的转换过程是通过 JSONObject.fromObject(lists) 实现的。
        //2、使用JSONArray
lists 被转换为对象后生成了 JSONArray 即 listArray 。
        
        
    }

我将使用 JSONObject 的方式进行了注释处理,现在我们先来查看注释之前所得到的结果。

在主线程中出现异常,异常信息为:net.sf.json.JSONException:'object'是一个数组。应使用 JSONArray 而不是。

告诉我有一个异常。查看源码后发现,在使用 fromObject 方法时会先判断参数类型。这表明传入的参数是 array 类型,因为使用的是 ArrayList。再看注释之后的结果。

listArray 中包含一个元素,该元素的地址是北京市海淀区,年龄是 23 ,名字是 JSON 。

这样结果是正常的。

json字符串--》》list

从上面的例子能够得知,list 的对象仅能转化为数组对象的格式。接着,我们来看下面关于字符串到 list 的转化情况。

公共静态的 void 类型的 jsonToList 方法,它用于将 JSON 数据转换为列表。具体来说,就是通过特定的算法和逻辑,把 JSON 格式的数据解析并转化为程序中可以使用的列表数据结构。这样在后续的程序处理中,就可以方便地对这些列表数据进行各种操作,如遍历、筛选、排序等。
        String arrayStr="[{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"北京市西城区\"}]";
        //转化为list
                List list2=(List使用 JSONArray 的 fromObject 方法将 arrayStr 转换为 JSONArray,然后再使用 toList 方法将该 JSONArray 转换为 Student 类的列表。
                
                for (Student stu : list2) {
                    System.out.println(stu);
                }
                //转化为数组
Student 数组 ss 等于将 JSONArray 从对象 arrayStr 转换而来的数组,再将其转换为 Student 类的数组。
                for (Student student : ss) {
                    System.out.println(student);
                }
        
        
    }

打印结果,

这位学生名叫 JSON,年龄 24 岁,居住在北京市西城区。
Student [name=JSON, age=24, address=北京市西城区]

字符串的格式为带有“[]”的格式,因此这里选择了 JSONArray 这个对象。它具备 toArray 和 toList 这两种方法可供使用,其中 toArray 方法可将其转化为 java 中的数组,toList 方法可将其转化为 java 中的 list。由于这里有实体类与之对应,所以在使用时指定了泛型的类型(Student.class),这样就能得到转化后的对象。

三、map和json字符串的互转

map--》》json字符串

公共静态的 void 方法 mapToJSON() 。 此方法用于进行某种映射操作并转换为 JSON 格式 。 它在相关的代码逻辑中起到特定的作用 。 通常在处理数据转换等场景下被调用 。 具体的映射和转换逻辑在方法内部实现 。 它与其他相关的代码模块协同工作 , 以完成特定的功能 。
        Student stu=new Student();
        stu.setName("JSON");
        stu.setAge("23");
        stu.setAddress("中国上海");
        Map map=new HashMap();
        map.put("first", stu);
        
        //1、JSONObject
通过调用 JSONObject 的 fromObject 方法,将 map 转换为 JSONObject 类型的对象,得到 mapObject 。
        
        //2、JSONArray
通过 fromObject 方法将 map 转换为 JSONArray 得到 mapArray 。
    }

打印结果,

mapObject 包含一个名为“first”的部分,“first”部分的“address”是“中国上海”,“first”部分的“age”是“23”,“first”部分的“name”是“JSON”。
mapArray 包含一个元素,该元素的 first 属性为一个对象,其 address 为“中国上海”,age 为“23”,name 为“JSON”。

上面打印了两种形式。

json字符串--》》map

JSON 字符串无法直接转化为 map 对象。若要获取 map 中的键所对应的值,需要借助其他方式。

公共静态的 void 方法 jsonToMap() {
字符串 strObject 等于一个包含 "first" 的对象,这个 "first" 对象又包含 "address" 为 "中国上海"、"age" 为 "23"、"name" 为 "JSON" 的信息。
        
        //JSONObject
通过 fromObject 方法将字符串对象 strObject 转换为 JSONObject 实例,得到的结果赋值给 jsonObject 。
        Map map=new HashMap();
将“first”作为键,“Student.class”作为值放入 map 中。
        //使用了toBean方法,需要三个参数 
MyBean my 进行了如下操作:先将 jsonObject 通过 JSONObject.toBean 方法进行转换,转换的目标类是 MyBean.class,同时还使用了 map 这个参数,最终转换的结果赋值给了 my 。
System 展示 my 的首个部分。
        
    }

打印结果,

学生,其姓名为 JSON,年龄 23 岁,住址是中国上海。

下面是MyBean的代码,

package com.cn.study.day4;
import java.util.Map;
从 com.cn.study.day3 这个路径中导入 Student 类。
public class MyBean {
    
    private Student first;
    public Student getFirst() {
        return first;
    }
设置第一个学生为传入的参数 first 。将传入的 Student 类型的对象 first 赋值给当前对象的 first 属性 。把 first 这个学生对象设定为当前对象的第一个学生 。将 first 这个学生赋值给表示第一个学生的属性 。使 first 成为当前对象的第一个学生 。把传入的 first 设定为当前对象的第一个学生 。
        this.first = first;
    }
    
}

使用 toBean()方法时传入了三个参数。第一个参数是 JSONObject 对象。第二个参数是 MyBean.class。第三个参数是一个 Map 对象。通过 MyBean 可知,此类中要有一个名为 first 的属性,其类型为 Student,并且要与 map 中的键和值的类型相对应,也就是 first 对应键,first 的类型对应值的类型。

在下篇中会继续说明关于将复杂的 JSON 串转化为 java 对象的相关内容。

这篇主要阐述了在 java 中,bean 与 list 之间的互转、bean 与 map 之间的互转以及 bean 与 JSON 之间的互转。

你可能想看:

猜你喜欢