Json解析

本文介绍了解析两种不同格式JSON数据的方法:普通格式和包含数组的格式。通过具体代码示例展示了如何获取并处理服务器返回的JSON数据。
json数据格式解析我自己分为两种;

一种是普通的,一种是带有数组形式的;


 

普通形式的:
服务器端返回的json数据格式如下:

{
"userbean":{"Uid":"100196","Showname":"\u75af\u72c2\u7684\u7334\u5b50","Avtar":null,"State":1}}

分析代码如下:

// TODO 状态处理 500 200 
                int res = 0
                res 
= httpClient.execute(httpPost).getStatusLine().getStatusCode(); 
                
if (res == 200) { 
                    
/* 
                     * 当返回码为200时,做处理 
                     * 得到服务器端返回json数据,并做处理 
                     * 
*/ 
                    HttpResponse httpResponse 
= httpClient.execute(httpPost); 
                    StringBuilder builder 
= new StringBuilder(); 
                    BufferedReader bufferedReader2 
= new BufferedReader( 
                            
new InputStreamReader(httpResponse.getEntity().getContent())); 
                    String str2 
= ""
                    
for (String s = bufferedReader2.readLine(); s != null; s = bufferedReader2 
                            .readLine()) { 
                        builder.append(s); 
                    } 
                    Log.i(
"cat"">>>>>>" + builder.toString());

JSONObject jsonObject 
= new JSONObject(builder.toString()) 
                        .getJSONObject(
"userbean"); 

                String Uid; 
                String Showname; 
                String Avtar; 
                String State; 

                Uid 
= jsonObject.getString("Uid"); 
                Showname 
= jsonObject.getString("Showname"); 
                Avtar 
= jsonObject.getString("Avtar"); 
                State 
= jsonObject.getString("State");
带数组形式的:
服务器端返回的数据格式为:

{
"calendar"
    {
"calendarlist"
            [ 
            {
"calendar_id":"1705","title":"(\u4eb2\u5b50)ddssd","category_name":"\u9ed8\u8ba4\u5206\u7c7b","showtime":"1288927800","endshowtime":"1288931400","allDay":false}, 
            {
"calendar_id":"1706","title":"(\u65c5\u884c)","category_name":"\u9ed8\u8ba4\u5206\u7c7b","showtime":"1288933200","endshowtime":"1288936800","allDay":false
            ] 
    } 
}

分析代码如下:

// TODO 状态处理 500 200 
                int res = 0
                res 
= httpClient.execute(httpPost).getStatusLine().getStatusCode(); 
                
if (res == 200) { 
                    
/* 
                     * 当返回码为200时,做处理 
                     * 得到服务器端返回json数据,并做处理 
                     * 
*/ 
                    HttpResponse httpResponse 
= httpClient.execute(httpPost); 
                    StringBuilder builder 
= new StringBuilder(); 
                    BufferedReader bufferedReader2 
= new BufferedReader( 
                            
new InputStreamReader(httpResponse.getEntity().getContent())); 
                    String str2 
= ""
                    
for (String s = bufferedReader2.readLine(); s != null; s = bufferedReader2 
                            .readLine()) { 
                        builder.append(s); 
                    } 
                    Log.i(
"cat"">>>>>>" + builder.toString()); 
                    
/** 
                     * 这里需要分析服务器回传的json格式数据, 
                     
*/ 
                    JSONObject jsonObject 
= new JSONObject(builder.toString()) 
                            .getJSONObject(
"calendar"); 
                    JSONArray jsonArray 
= jsonObject.getJSONArray("calendarlist"); 
                    
for(int i=0;i<jsonArray.length();i++){ 
                        JSONObject jsonObject2 
= (JSONObject)jsonArray.opt(i); 
                        CalendarInfo calendarInfo 
= new CalendarInfo(); 
                        calendarInfo.setCalendar_id(jsonObject2.getString(
"calendar_id")); 
                        calendarInfo.setTitle(jsonObject2.getString(
"title")); 
                        calendarInfo.setCategory_name(jsonObject2.getString(
"category_name")); 
                        calendarInfo.setShowtime(jsonObject2.getString(
"showtime")); 
                        calendarInfo.setEndtime(jsonObject2.getString(
"endshowtime")); 
                        calendarInfo.setAllDay(jsonObject2.getBoolean(
"allDay")); 
                        calendarInfos.add(calendarInfo); 
                    }

总结,普通形式的只需用JSONObject ,带数组形式的需要使用JSONArray 将其变成一个list。
### 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 数据,尽量将解析结果缓存起来以减少重复解析的开销。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值