json解析

本文详细介绍了JSON数据格式的基础知识,包括其语法规则及如何在Android应用中进行解析。通过具体的Java代码示例,展示了不同类型的JSON数据(如key/value、key/object、key/array)的解析方法。

android开发中,与服务器交互80%是通过json方式传输数据,JSON 也是基于纯文本的数据格式,JSON具有跨平台的优势,相对xml,json解析起来更方便,简单,解析数据所消耗的流量也会比xml少,而且json有一些好的第三方库文件,已为开发者封装好了,


JSON语法规则:

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON 名称/值对

JSON 数据的书写格式是:名称/值对

名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:比如;"firstName":"John"

JSON 值

JSON 值可以是:
  • 数字 (整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

比如值是基本类型

 

{"city":"Beijing","street":" Chaoyang Road ","postcode":100025} 

{}代表是一个对象,这些都是简单的key/value形式,如果用对象来表示的话:

public class Info {
	public String city;
	public String street;
	public int postcode;
}

在这个javabean中并没有使用get,set方法,因为get,set方法是使用反射做的,比较慢,这是json最简单的方式,key/value形式,我们知道json有三种种方式,一种是key/value,key/Object,key/array,现在讲讲key/Object形式

比如:

{"name":"Michael","address":{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}} 

这里有2个对象,一个是最外面的,一个是address:它也是一个对象,我们说了{}就代表一个对象,因此 首先写里面的对象,然后再写外面的对象,代码如下:

Info.java

package com.example.josn;

public class Info {
	public String city;
	public String street;
	public int postcode;
}

Person.java

/**
 * {"name":"Michael","address":{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}} 
 * @author carpool
 *
 */
public class Person {
		public String name;
		public Info info;
}

json解析代码:

</pre><pre class="java" name="code">String jsonString = getJsonString();
		try {
			JSONObject jb = new JSONObject(jsonString);
			Person p = new Person();
			Info info  = new Info();
			info.city = jb.getJSONObject("address").getString("city");
			info.street = jb.getJSONObject("address").getString("street");
			info.postcode = jb.getJSONObject("address").getInt("postcode");
			p.info = info;
			p.name = jb.getString("name");
		} catch (JSONException e) {
			e.printStackTrace();
		}


现在还剩下一个种形式json,就是key/array,比如:

{
    "people": [
        {
            "firstName": "Brett",
            "lastName": "McLaughlin",
            "email": "aaaa"
        },
        {
            "firstName": "Jason",
            "lastName": "Hunter",
            "email": "bbbb"
        },
        {
            "firstName": "Elliotte",
            "lastName": "Harold",
            "email": "cccc"
        }
    ]
}

我们知道{}代表的是一个对象,[]代表的是数组,表示数组中存放了很多对象,对象之间用逗号(,)分开,

这个用对象封装一般有二种形式,一是直接用集合把解析的对象存储起来,二是用一个类封装一个集合,集合的对象就是上面所解析的对象即可

第一种方式:

People.java

public class People {
	public String firstName;
	public String lastName;
	public String email;
}


解析:

String jsonString = getJsonString();//json串
		try {
			JSONObject jb = new JSONObject(jsonString);
			JSONArray ja = jb.getJSONArray("people");
			ArrayList<People> ps = new ArrayList<People>();
			for(int i=0;i<ja.length();i++){
				People p = new People();
				p.email = ja.getJSONObject(i).getString("email");
				p.firstName = ja.getJSONObject(i).getString("firstName");
				p.lastName = ja.getJSONObject(i).getString("lastName");
				ps.add(p);
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}


第二种写法:

public class Multiplepeople {
	public List<People> peoples;
}

String jsonString = getJsonString();//json串
		try {
			JSONObject jb = new JSONObject(jsonString);
			JSONArray ja = jb.getJSONArray("people");
			Multiplepeople multiplepeople = new Multiplepeople();
			List<People> ps = new ArrayList<People>();
  			for(int i=0;i<ja.length();i++){
				People p = new People();
				p.email = ja.getJSONObject(i).getString("email");
				p.firstName = ja.getJSONObject(i).getString("firstName");
				p.lastName = ja.getJSONObject(i).getString("lastName");
				ps.add(p);
			}
  			multiplepeople.peoples =ps;
		} catch (JSONException e) {
			e.printStackTrace();
		}
json就到了,多练习就会了!







代表的是key为address,值是个对象,






### JSON 数据解析方法 #### 1. Java 中解析 JSON 数据的方法 在 Java 开发中,常用的 JSON 解析方法包括使用 **Jackson**、**Gson** 和 **Fastjson** 等库来处理 JSON 数据。 - **Jackson** 是一个高性能的 JSON 解析库,支持将 JSON 字符串转换为 Java 对象,也可以将 Java 对象序列化为 JSON 字符串。使用 `ObjectMapper` 类可以实现 JSON解析与生成。 - **Gson** 是 Google 提供的一个用于解析和生成 JSON 的库,适用于 Java 对象与 JSON 数据之间的转换。它提供了 `fromJson()` 和 `toJson()` 方法来实现数据的转换。 - **Fastjson** 是阿里巴巴开发的一个高性能 JSON 库,支持将 JSON 字符串解析为 Java 对象,也可以将 Java 对象转换为 JSON 字符串。它提供了 `parseObject()` 和 `parseArray()` 方法来处理 JSON 数据[^1]。 #### 2. 前端解析 JSON 数据的方法 在前端开发中,JavaScript 提供了内置的 JSON 解析方法。 - 使用 `JSON.parse()` 方法可以将 JSON 字符串解析为 JavaScript 对象。例如,`const jsonObj = JSON.parse(jsonStr);`,其中 `jsonStr` 是一个 JSON 格式的字符串。 - 解析后的 JSON 对象可以像普通对象一样进行访问和操作。例如,可以通过 `jsonObj.length` 来获取数组长度,或者通过 `jsonObj.key` 来访问特定字段的值[^2]。 #### 3. JSON 语法与结构 JSON 数据由键值对组成,支持多种数据类型,包括字符串、数字、布尔值、对象、数组和 `null`。 - 示例 JSON 数据: ```json { "name": "zhangsan", "age": 28, "badperson": true, "child": { "name": "zhangxiaosan", "age": 8 }, "job": ["React", "JavaScript"], "wages": null } ``` 该 JSON 对象包含字符串、数字、布尔值、嵌套对象、数组和 `null` 值。在解析过程中,需要确保 JSON 数据格式正确,否则会导致解析失败[^3]。 ### JSON 数据解析常见问题 #### 1. JSON 格式错误 JSON 数据必须遵循严格的格式规范,否则会导致解析失败。常见的格式错误包括缺少逗号、引号不匹配、括号不闭合等。例如,字段名和字符串值必须使用双引号包裹,布尔值和 `null` 不需要引号。 - 错误示例: ```json { name: "zhangsan", age: 28 } // 字段名未使用双引号包裹 ``` - 正确示例: ```json { "name": "zhangsan", "age": 28 } ``` #### 2. 数据类型不匹配 在解析 JSON 数据时,如果目标对象的字段类型与 JSON 数据中的值类型不匹配,可能会导致解析错误或数据丢失。例如,JSON 数据中的数字值被解析为字符串类型,或者布尔值被解析为字符串。 - 解决方法:确保目标对象的字段类型与 JSON 数据中的值类型一致,或者在解析时进行类型转换。 #### 3. 嵌套结构处理不当 JSON 数据可能包含嵌套的对象或数组,处理嵌套结构时需要逐层解析。例如,解析嵌套对象时,需要先获取外层对象,再获取内层对象的字段。 - 示例代码(使用 Jackson 解析嵌套对象): ```java ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = "{ \"name\": \"zhangsan\", \"child\": { \"name\": \"zhangxiaosan\", \"age\": 8 } }"; JsonNode jsonNode = objectMapper.readTree(jsonStr); String childName = jsonNode.get("child").get("name").asText(); // 获取嵌套对象中的字段值 ``` #### 4. 异常处理 在解析 JSON 数据时,可能会遇到异常情况,例如空指针异常、类型转换异常等。为了避免程序崩溃,需要添加异常处理逻辑。 - 示例代码(使用 Gson 解析 JSON 数据并处理异常): ```java try { String jsonStr = "{ \"name\": \"zhangsan\", \"age\": 28 }"; Person person = new Gson().fromJson(jsonStr, Person.class); } catch (JsonSyntaxException e) { System.out.println("JSON 解析失败: " + e.getMessage()); } ``` #### 5. 性能优化 在处理大量 JSON 数据时,解析性能可能会成为瓶颈。为了提高解析效率,可以选择高性能的 JSON 解析库,例如 Jackson 或 Fastjson。此外,避免在循环中频繁解析 JSON 数据,尽量将解析结果缓存起来以减少重复解析的开销。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值