Json (JsonObject、JsonArray)

本文深入对比JSON与XML数据结构的特点,解析JSON的三种数据类型及其优缺点,详细说明JSON的语法规则,并提供实例演示如何从字符串转换为JSON对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是JSON?

JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。

Json与XML的比较

XML的结构:倒立的树形结构

<people> 
        <person id="1">
                <name>张三</name>
                <age>20</age>
                <gender>男</gender>
        </person>
        <peson id="2">
                <name>李四</name>
                <age>25</age>
                <gender>女</gender>
        </person>
</people>

Json的结构:

{

  people:[

            { "id" : "123",  "name" : "张三",  "age" : "20",  "gender" : "男" } , 

            { "id" : "456",  "name" : "李四",  "age" : "25",  "gender" : "女" } , 

  ] 

};

与Json有关的三种数据类型

第一种数据类型:标量(scalar),也就是一个单数的字符串(string)或者数字(numbers),比如”北京”这个单独的词.

第二种数据类型:序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫数组(array)或者列表(list),比如”北京,上海”.

第三种数据类型:映射(mapping),也就是一个名/值对(name/value),即数据有一个名称,还有一个相对应的值,这又称作散列(hash)或者字典(dictionary),比如”首都: 北京”

Json的优点和缺点

优点:

1.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小.

2.支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript.Perl.PHP.Python,Ruby等服务器端语言,便于服务器端的解析.

缺点:

1.要求字符集,必须是Unicode,受约束性强.否则会产生空或者乱码。

2.语法过于严谨,必须遵循json语法的四分原则. 

 

Json的语法规则

JSON就是一串字符串 只不过元素会使用特定的符号标注。

1、{} 双括号表示对象 - JsonObject

2、[] 中括号表示数组(对象的集合) - JsonArray

3、"" 双引号内是属性或值

4、: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

5、并列的数据之间用逗号(“,”)分隔

    JSON基于两种结构:

1、JsonObject

       JsonObject的数据是用 {  } 来表示的,JsonObject可以包含有JsonArray。

       例如:  

 { "id" : "123", "name" : "张三", "age" : "20", "gender" : "男" }  ;

{

  data:[

            { "id" : "123",  "name" : "张三",  "age" : "20",  "gender" : "男" } , 

            { "id" : "456",  "name" : "李四",  "age" : "25",  "gender" : "女" } , 

  ] 

};

2、JsonArray

        顾名思义是由JsonObject构成的数组,用  [ { } , { } , ......  , { } ]  来表示

        例如:  表示了包含2个JSONObject的JSONArray。可以看到一个很明显的区别,一个用的是 {  }  ,一个最外面用的是 [  ]  

[

  { "id" : "123",  "name" : "张三",  "age" : "20",  "gender" : "男" } , 

  { "id" : "456",  "name" : "李四",  "age" : "25",  "gender" : "女" } , 

] 


 

3、如何从字符串String获得JSONObject对象和JSONArray对象            

                   JsonObject  jsonObject  = new JsonObject ( String  str);

                   JsonArray   jsonArray   = new JsonArray(String    str  ) ;

 或者使用Google的Gson类

                   JsonObject jsonObject = gson.fromJson(str, JsonObject.class)

                   JsonArray  jsonArray  = gson.fromJson(str, JsonArray.class)

4、如何从JsonArray中获得JsonObject对象

       大家可以把JsonArray当成一般的数组来对待,只是获取的数据内数据的方法不一样                   

                   JsonObject   jsonObject = (JsonObject)jsonArray.get(i);

                   JsonObject   jsonObject  =  jsonArray.getJsonObject(i) ;  

       两者都可。第一种注意转换 

5、如何从中JsonObject获得JsonArray对象

        从jsonObject中获取名为 "data"  的 jsonArray                

                  JsonArray jsonArray=jsonObject.getAsJsonArray("data");

        以上述例子为结果,可以得到处理后的数据

[

  { "id" : "123",  "name" : "张三",  "age" : "20",  "gender" : "男" } , 

  { "id" : "456",  "name" : "李四",  "age" : "25",  "gender" : "女" } , 

] 

       依据上一步骤得到的jsonArray,获取其中一个JsonObject

                   JsonObject   jsonObject = (JsonObject)jsonArray.get(0);

       结果如下:

 { "id" : "123",  "name" : "张三",  "age" : "20",  "gender" : "男" } , 

6、转换成对象

   将json转换成POJO类,单个:

                   Person person = gson.fromJson(json, Person.class);

 多个:

       List<Person>  people = gson.fromJson(json,new TypeToken<List<Person>>() {}.getType()));

7、对象转换成json

List<Object> 转换成 json

List<Object>  results =  new List<Object>;
Gson gson = new Gson();
String str = gson.toJson(results);
JSONArray jsonArray = JSONArray.parseArray(str);

在处理 JSON 数据时,`JSONArray` 和 `JSONObject` 是两个核心的数据结构,分别用于表示数组和对象。以下是它们的使用方法及示例。 ### JSONArray 的使用方法 `JSONArray` 通常由一组用方括号 `[]` 包裹的值组成,这些值可以是基本类型(如字符串、数字)或嵌套的 `JSONObject` 或 `JSONArray`。 #### 示例:创建和解析 JSONArray ```java import net.sf.json.JSONArray; public class JsonArrayExample { public static void main(String[] args) { // 创建一个 JSONArray JSONArray jsonArray = new JSONArray(); jsonArray.add("value1"); jsonArray.add("value2"); jsonArray.add("value3"); // 输出 JSONArray System.out.println(jsonArray); // ["value1","value2","value3"] } } ``` #### 示例:从字符串解析 JSONArray ```java import net.sf.json.JSONArray; public class JsonArrayParseExample { public static void main(String[] args) { String arrayStr = "[\"value1\", \"value2\", \"value3\"]"; JSONArray getJsonArray = JSONArray.fromObject(arrayStr); // 将字符串转换为 JSONArray [^1] System.out.println(getJsonArray); // ["value1","value2","value3"] } } ``` ### JSONObject 的使用方法 `JSONObject` 通常由一对花括号 `{}` 包裹,包含键值对,其中键是字符串,值可以是基本类型、`JSONArray` 或另一个 `JSONObject`。 #### 示例:创建和解析 JSONObject ```java import net.sf.json.JSONObject; public class JsonObjectExample { public static void main(String[] args) { // 创建一个 JSONObject JSONObject jsonObject = new JSONObject(); jsonObject.put("name", "John"); jsonObject.put("age", 30); jsonObject.put("isStudent", false); // 输出 JSONObject System.out.println(jsonObject); // {"name":"John","age":30,"isStudent":false} } } ``` #### 示例:从字符串解析 JSONObject ```java import net.sf.json.JSONObject; public class JsonObjectParseExample { public static void main(String[] args) { String objectStr = "{\"name\":\"John\", \"age\":30, \"isStudent\":false}"; JSONObject getJsonObj = JSONObject.fromObject(objectStr); // 将字符串转换为 JSONObject [^1] System.out.println(getJsonObj); // {"name":"John","age":30,"isStudent":false} } } ``` ### 嵌套结构的使用方法 JSON 数据结构通常包含嵌套的 `JSONObject` 和 `JSONArray`,可以通过链式调用来访问深层数据。 #### 示例:访问嵌套结构中的数据 ```java import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class NestedJsonExample { public static void main(String[] args) { String complexJsonStr = "{" + "\"user\": {" + " \"name\": \"Alice\"," + " \"hobbies\": [\"reading\", \"coding\", \"gaming\"]" + "}" + "}"; JSONObject jsonObject = JSONObject.fromObject(complexJsonStr); // 解析整个 JSON 字符串 [^1] JSONObject userObj = jsonObject.getJSONObject("user"); // 获取嵌套的 JSONObject [^3] JSONArray hobbiesArray = userObj.getJSONArray("hobbies"); // 获取嵌套的 JSONArray [^3] System.out.println("User Name: " + userObj.getString("name")); // 输出用户名称 [^3] System.out.println("Hobbies: " + hobbiesArray); // 输出兴趣爱好数组 [^3] } } ``` ### 总结 - `JSONArray` 表示数组,使用 `[]` 包裹,适用于多个值的集合。 - `JSONObject` 表示对象,使用 `{}` 包裹,适用于键值对的结构。 - 使用 `getJSONObject()` 和 `getJSONArray()` 方法可以从父结构中提取子结构。 - 通过 `getString()`, `getInt()`, `getBoolean()` 等方法可以获取具体字段的值。 以上代码展示了如何在 Java 中使用 `net.sf.json` 库来操作 `JSONArray` 和 `JSONObject`,并演示了如何解析和访问嵌套的 JSON 数据结构 [^1][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值