JSON简介

  • JAVAScript Object Notation是一种轻量级的数据交换格式
  • 具有良好的可读和便于快速编写的特性。
  • 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
  • JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
  • JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强

JSON支持的数据类型

我们要学习使用JSON解析,必须对JSON解析的规则原理有深刻的认识和了解,然后才知道它的一个实现原理 
JSON里面的数据是以一种键值对的方式存在 
(”key”:”value”)中值的类型可以是下面数据类型中的任意一种: 
1. 数字(整数或浮点数) 
2. 逻辑值(true 或 false) 
3. 字符串(在双引号中) 
4. 数组(在方括号中) 
5. 函数 
6. 对象(在大括号中) 
7. null

JSON语法规则

JSON的语法规则非常的简单,就是使用 
大括号’{}’, 
中括号’[]’, 
逗号’,’, 
冒号’:’, 
双引号’“”’。

数据类型: 
嵌套对象、数组、字符串、数字、布尔值或空值。

我们在JSON解析中只有三中情况出现 
1.{} 解析’大括号’类型 
2. [ ] 解析是’中括号’类型 
3. 其实只有两种,那第三种则是1与2的组合方法即”{’name’:’李书豪’ ,’hobby’:[‘编程’,’电竞’,’睡觉’]}”那么下面分别来看一些这三种类型以及解析

JSON基本语法与图例

  • Object(对象类型) 
  • 用{ }包含一系列无序的key–Value键值对表示,其中Key和Value之间用冒号分割,每个key-value之间用逗号分割。
  • 比如:
  • Array(数组类型) 
  • 使用[ ]包含所有元素,每个元素用逗号分隔,元素可以是任意的值
  • 比如:
  • 组合形 

JSON数据解析

  • JSON解析一定要掌握的两条规则:
  • 1.如果看到是{ }–>使用JSONObject
  • 2.如果看到的[ ]–>使用JSONArray解析
  • 掌握了JSON的数据类型和基本语法后,下面我们将对JSON的各种语法类型进行详细解析(注意掌握两条规则的使用,掌握了JSON解析就那么回事)

纯对象(Object)的解析{ }:



[java]  view plain  copy




1. import
2. import
3.   
4. /**
5.  * JSON-->纯对象(Object)的解析
6.  * 
7.  * 注:我们在eclipse里面操作JSON解析的时候需要第三方jar包的支持
8.  * @author sKy°
9.  * @date 2016-5-8
10.  * @version 1.0
11.  */
12. public class
13. public static void
14. //      编辑一个我们要解析的数据对象
15. //     根据JSON的官方定义,键,加"",值,如果是字符串,就加"",其他不加。
16. "{'name':'李书豪','age':24}";  
17.   
18. try
19. //          创建JSON解析对象(两条规则的体现:大括号用JSONObject,注意传入数据对象)
20. new
21. //          obj.后面有各种数据类型,根据对象来选择使用的数据类型
22. "name");  
23. //          同理如上,这里的age为Int类型,我们就用对应的类型进行解析
24. int age = obj.getInt("age");  
25. //          最后输出到控制台
26. "<--->"+age);  
27.   
28. catch
29.             e.printStackTrace();  
30.         }  
31.   
32.     }  
33. }


java json包含中文 解析失败_JSON

纯数组(Array)的解析{ }:



[java]  view plain  copy




1. import
2. import
3.   
4. /**
5.  * 对纯数组Aarry的解析
6.  * @author sKy°
7.  * @date 2016-5-8
8.  * @version 1.0
9.  */
10. public class
11. public static void
12. //      编辑一个我们要解析的数据对象
13. "['天津冷','北京暖','东京热','南京凉']";  
14.   
15. try
16. //          创建JSON解析对象(两条规则的体现:中括号用JSONArray,注意传入数据对象)
17. new
18. //          取得数组长度
19. int
20. //          回想数组的取值的方式? --->for循环遍历数组--->得到值
21. for (int i = 0; i < length; i++) {  
22. //              根据解析的数据类型使用该类型的get方法得到该值,打印输出
23.                 String string = jArray.getString(i);  
24. ",");  
25.             }  
26.   
27. catch
28. // TODO: handle exception
29.         }  
30.   
31.   
32.     }  
33. }


java json包含中文 解析失败_大括号_02

组合类型的解析(一):
  • 例子: String json=”{‘name’:’李书豪’,’girlFriend’:{‘name’:’高圆圆’,’age’:18}}”;
  • 分析: 我们首先是解析外面的大括号的对象,然后,通过girlfFriend,获取到对应的被包含的里面大括号对象。所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值

[java]  view plain  copy






    1. /**
    2.  * 创建一个Person用于接收解析数据,封装对应字段
    3.  * @author sKy°
    4.  * @date 2016-5-8
    5.  * @version 1.0
    6.  */
    7. public class
    8. //    分析我们要解析的对象,根据解析对象的属性值去创建对应的属性值
    9. //    根据分析我们所要解析的对象,两条属性 1.name(String类型) 2.是girlFrien(类类型,意味着还需要在类中去嵌套一个类(创建类部类也可))
    10.   
    11. //   封装字段
    12. private
    13. private GirlFriend girlFriend;  //类类型
    14. //   setter getter方法
    15. public
    16. return
    17.     }  
    18. public void
    19. this.name = name;  
    20.     }  
    21. public
    22. return
    23.     }  
    24. public void
    25. this.girlFriend = girlFriend;  
    26.     }  
    27.   
    28. //   toString方法用于控制台输出
    29. @Override
    30. public
    31. return "Person [name=" + name + ", girlFriend=" + girlFriend + "]";  
    32.     }  
    33.   
    34. }  
    35.   
    36. // 为了方便咱们看,这里就直接在下面创建了一个GirlFriend这个类
    37. class
    38. //   根据对象属性值,创建对应的值
    39. private
    40. private int
    41. //   setter getter方法
    42. public
    43. return
    44.     }  
    45. public void
    46. this.name = name;  
    47.     }  
    48. public int
    49. return
    50.     }  
    51. public void setAge(int
    52. this.age = age;  
    53.     }  
    54. //   toString方法用于控制台输出
    55. @Override
    56. public
    57. return "GirlFriend [name=" + name + ", age=" + age + "]";  
    58.     }  
    59.   
    60.   
    61.   
    62. }




    开始解析:

    [java]  view plain  copy






    1. import
    2. import
    3.   
    4.   
    5.   
    6.   
    7.   
    8. /**
    9.  * 组合数据类型的解析--->对象嵌套对象类型
    10.  * @author sKy°
    11.  * @date 2016-5-8
    12.  * @version 1.0
    13.  */
    14. public class
    15. public static void
    16. //      编辑一个我们要解析的数据对象
    17. //      分析: 应该先解析外面的大的对象,然后,通过girlfFriend,获取到对应的被包含的对象。
    18. //      所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值
    19.   
    20. "{'name':'李书豪','girlFriend':{'name':'高圆圆','age':18}}";  
    21. try
    22. //          1.创建JSON解析对象(两条规则的提现:大括号用JSONObject,注意传入数据对象)
    23. new
    24. //          2.实例化Person对象获取对应的值--->这里是获得外面大括号{}的name值 思考?里面{}如何获得?
    25. new
    26. "name");  
    27.             per.setName(name);  
    28. //          3.分析:里面{}是嵌套在外面大括号类的所以我们解析的对象是通过外面大括号去取得里面大括号值,注意看
    29. //取得对应里面大括号的girlFriend,取得name值,赋值给girlFriend对象
    30. new
    31. "girlFriend");  
    32. "name");  
    33.             girlFriend.setName(gfName);  
    34. //          获得age值并赋值
    35. int gfAge = jObj1.getInt("age");  
    36.             girlFriend.setAge(gfAge);  
    37. //          通过set把girlFriend的值赋Person 用于toString的输出,不然为空
    38.             per.setGirlFriend(girlFriend);  
    39. //          输出
    40.             System.out.println(per);  
    41. catch
    42.         e.printStackTrace();  
    43.     }  
    44.     }  
    45. }



    java json包含中文 解析失败_json_03


    小结: {[ {},{} ]}–>思路:第一步看到大括号:JSONObject去解,创建好对应里面的属性的值;第二步看到中括号:JSONArray去解析 对应创建好对应里面的属性值;第三步中括号里面的{},又是一个JSONObject。思路大致如此,强调注意的是,设置的属性值setXxx getXxx必须要和去获得值名称一致,不然会出错!!

    组合类型的解析(二):

    下面我们来解析一个略为复杂的JSON数据 


    要解析的数据如下:



    [java]  view plain  copy


    1. {  
    2. 'desc': 'OK',  
    3. 'status': 1000,  
    4. 'data': {  
    5. 'wendu': '20',  
    6. 'ganmao': '相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。',  
    7. 'forecast': [  
    8.             {  
    9. 'fengxiang': '北风',  
    10. 'fengli': '3-4级',  
    11. 'high': '高温 27℃',  
    12. 'type': '中雨',  
    13. 'low': '低温 19℃',  
    14. 'date': '6日星期五'
    15.             },  
    16.             {  
    17. 'fengxiang': '北风',  
    18. 'fengli': '微风级',  
    19. 'high': '高温 23℃',  
    20. 'type': '大雨',  
    21. 'low': '低温 17℃',  
    22. 'date': '7日星期六'
    23.             },  
    24.             {  
    25. 'fengxiang': '北风',  
    26. 'fengli': '微风级',  
    27. 'high': '高温 26℃',  
    28. 'type': '小雨',  
    29. 'low': '低温 17℃',  
    30. 'date': '8日星期天'
    31.             },  
    32.             {  
    33. 'fengxiang': '南风',  
    34. 'fengli': '微风级',  
    35. 'high': '高温 27℃',  
    36. 'type': '多云',  
    37. 'low': '低温 15℃',  
    38. 'date': '9日星期一'
    39.             },  
    40.             {  
    41. 'fengxiang': '南风',  
    42. 'fengli': '微风级',  
    43. 'high': '高温 29℃',  
    44. 'type': '多云',  
    45. 'low': '低温 16℃',  
    46. 'date': '10日星期二'
    47.             }  
    48.         ],  
    49. 'yesterday': {  
    50. 'fl': '微风',  
    51. 'fx': '北风',  
    52. 'high': '高温 33℃',  
    53. 'type': '阴',  
    54. 'low': '低温 22℃',  
    55. 'date': '5日星期四'
    56.         },  
    57. 'aqi': '58',  
    58. 'city': '成都'
    59.     }  
    60. }


    因为数据略大,不方便咱们看,这里给大家提供一个JSON在线解析工具http://json.phpddt.com/ 这是JSON在线高亮解析 ,可以很好的帮助咱们进行解析分析。下面是我用网页解析好的图片,可以思考下步骤(记住两条规则) 

    java json包含中文 解析失败_java json包含中文 解析失败_04

    分析: 

    java json包含中文 解析失败_json_05


    一:第一个大括号(JSONObject){”desc”: “status”: “data”} 

    二:大括号里面有一个大括号(JSONObject){”wendu”: “20”, “ganmao”: “forecast”: “yesterday”: “aqi”: “city”: } 

    三:第二个大括号里面有两个对象 1.数组形(JSONArray) 2.对象形( JSONObject ) 

    而数组形里面又套有数组的对象{} 。这就需要咱们在解析的时候需要很细致的去创建对应的属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!

    开始封装字段:


    [java]  view plain  copy

    1. import
    2.   
    3. /**
    4.  * 对应的字段的封装
    5.  * @author sKy°
    6.  * @date 2016-5-6
    7.  * @version 1.0
    8.  */
    9. public class
    10. //  外面大括号的字段封装 setter getter toString
    11. public
    12. public int
    13. public
    14. @Override
    15. public
    16. return "Weather [desc=" + desc + ", status=" + status + ", data="
    17. "]";  
    18.     }  
    19.   
    20.   
    21. }  
    22.   
    23. class
    24. //  里面大括号的字段封装 setter getter toString 
    25. //  该类中包含有数组形和对象形,需要一并的封装在里面
    26. public
    27. public
    28. public
    29. public
    30. public
    31. public
    32. @Override
    33. public
    34. return "Data [wendu=" + wendu + ", ganmao=" + ganmao + ", forecast="
    35. ", yesterday=" + yesterday + ", aqi="
    36. ", city=" + city + "]";  
    37.     }  
    38.   
    39.   
    40. }  
    41.   
    42. class
    43. //  数组里面的大括号类型字段的封装
    44. public
    45. public
    46. public
    47. public
    48. public
    49. public
    50. @Override
    51. public
    52. return "Forecast [fengxiang=" + fengxiang + ", fengli="
    53. ", high=" + high + ", type=" + type + ", low="
    54. ", date=" + date + "]";  
    55.     }  
    56.   
    57.   
    58. }  
    59. class
    60. //   最后{}的字段封装
    61. public
    62. public
    63. public
    64. public
    65. public
    66. public
    67. @Override
    68. public
    69. return "Yesterday [fl=" + fl + ", fx=" + fx + ", high="
    70. ", type=" + type + ", low=" + low + ", date=" + date + "]";  
    71.     }  
    72.   
    73. }


    开始解析:

    [java]       view plain       copy      
                          
    1. import
    2. import
    3.   
    4. import
    5. import
    6. import
    7.   
    8.   
    9.   
    10.   
    11. /**
    12.  * 组合类型二的解析
    13.  * @author sKy°
    14.  * @date 2016-5-6
    15.  * @version 1.0
    16.  */
    17. public class
    18. public static void main(String[] args) throws
    19.   
    20. //要解析的对象
    21. "{ 'desc': 'OK', 'status': 1000, 'data': { 'wendu': '20', 'ganmao': '相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。', 'forecast': [ { 'fengxiang': '北风', 'fengli': '3-4级', 'high': '高温 27℃', 'type': '中雨', 'low': '低温 19℃', 'date': '6日星期五' }, { 'fengxiang': '北风', 'fengli': '微风级', 'high': '高温 23℃', 'type': '大雨', 'low': '低温 17℃', 'date': '7日星期六' }, { 'fengxiang': '北风', 'fengli': '微风级', 'high': '高温 26℃', 'type': '小雨', 'low': '低温 17℃', 'date': '8日星期天' }, { 'fengxiang': '南风', 'fengli': '微风级', 'high': '高温 27℃', 'type': '多云', 'low': '低温 15℃', 'date': '9日星期一' }, { 'fengxiang': '南风', 'fengli': '微风级', 'high': '高温 29℃', 'type': '多云', 'low': '低温 16℃', 'date': '10日星期二' } ], 'yesterday': { 'fl': '微风', 'fx': '北风', 'high': '高温 33℃', 'type': '阴', 'low': '低温 22℃', 'date': '5日星期四' }, 'aqi': '58', 'city': '成都' } }";  
    22.   
    23. new
    24. //      首先看到的是一个{}所以用JSON Object来进行解析
    25. //      获得外部的Weather
    26. new
    27. "desc");  
    28. int status = obj.getInt("status");  
    29.         wea.status=status;  
    30.         wea.desc=desc;  
    31.   
    32. //      获得内部Data的数据
    33. "data");  
    34. new
    35. "wendu");  
    36. "ganmao");  
    37. "aqi");  
    38. "city");  
    39.         wea.data=data;  
    40. new
    41.   
    42. //      获取forecast数组
    43. "forecast");  
    44. for (int i = 0; i < jArr.length(); i++) {  
    45.             JSONObject obj2 = jArr.getJSONObject(i);  
    46. new
    47. "date");  
    48. "fengxiang");  
    49. "high");  
    50. "low");  
    51. "fengli");  
    52. "type");  
    53.             forecasts.add(forecast);  
    54.         }  
    55.         data.forecast=forecasts;  
    56. "yesterday");  
    57.

    JSON简介

    • JAVAScript Object Notation是一种轻量级的数据交换格式
    • 具有良好的可读和便于快速编写的特性。
    • 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
    • JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
    • JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强

    JSON支持的数据类型

    我们要学习使用JSON解析,必须对JSON解析的规则原理有深刻的认识和了解,然后才知道它的一个实现原理 
    JSON里面的数据是以一种键值对的方式存在 
    (”key”:”value”)中值的类型可以是下面数据类型中的任意一种: 
    1. 数字(整数或浮点数) 
    2. 逻辑值(true 或 false) 
    3. 字符串(在双引号中) 
    4. 数组(在方括号中) 
    5. 函数 
    6. 对象(在大括号中) 
    7. null

    JSON语法规则

    JSON的语法规则非常的简单,就是使用 
    大括号’{}’, 
    中括号’[]’, 
    逗号’,’, 
    冒号’:’, 
    双引号’“”’。

    数据类型: 
    嵌套对象、数组、字符串、数字、布尔值或空值。

    我们在JSON解析中只有三中情况出现 
    1.{} 解析’大括号’类型 
    2. [ ] 解析是’中括号’类型 
    3. 其实只有两种,那第三种则是1与2的组合方法即”{’name’:’李书豪’ ,’hobby’:[‘编程’,’电竞’,’睡觉’]}”那么下面分别来看一些这三种类型以及解析

    JSON基本语法与图例

    • Object(对象类型) 
    • 用{ }包含一系列无序的key–Value键值对表示,其中Key和Value之间用冒号分割,每个key-value之间用逗号分割。
    • 比如:
    • Array(数组类型) 
    • 使用[ ]包含所有元素,每个元素用逗号分隔,元素可以是任意的值
    • 比如:
    • 组合形 

    JSON数据解析

    • JSON解析一定要掌握的两条规则:
    • 1.如果看到是{ }–>使用JSONObject
    • 2.如果看到的[ ]–>使用JSONArray解析
    • 掌握了JSON的数据类型和基本语法后,下面我们将对JSON的各种语法类型进行详细解析(注意掌握两条规则的使用,掌握了JSON解析就那么回事)

    纯对象(Object)的解析{ }:


    [java]  view plain  copy

    1. import
    2. import
    3.   
    4. /**
    5.  * JSON-->纯对象(Object)的解析
    6.  * 
    7.  * 注:我们在eclipse里面操作JSON解析的时候需要第三方jar包的支持
    8.  * @author sKy°
    9.  * @date 2016-5-8
    10.  * @version 1.0
    11.  */
    12. public class
    13. public static void
    14. //      编辑一个我们要解析的数据对象
    15. //     根据JSON的官方定义,键,加"",值,如果是字符串,就加"",其他不加。
    16. "{'name':'李书豪','age':24}";  
    17.   
    18. try
    19. //          创建JSON解析对象(两条规则的体现:大括号用JSONObject,注意传入数据对象)
    20. new
    21. //          obj.后面有各种数据类型,根据对象来选择使用的数据类型
    22. "name");  
    23. //          同理如上,这里的age为Int类型,我们就用对应的类型进行解析
    24. int age = obj.getInt("age");  
    25. //          最后输出到控制台
    26. "<--->"+age);  
    27.   
    28. catch
    29.             e.printStackTrace();  
    30.         }  
    31.   
    32.     }  
    33. }


    java json包含中文 解析失败_JSON

    纯数组(Array)的解析{ }:


    [java]

    view plain       copy      
                          
    1. import
    2. import
    3.   
    4. /**
    5.  * 对纯数组Aarry的解析
    6.  * @author sKy°
    7.  * @date 2016-5-8
    8.  * @version 1.0
    9.  */
    10. public class
    11. public static void
    12. //      编辑一个我们要解析的数据对象
    13. "['天津冷','北京暖','东京热','南京凉']";  
    14.   
    15. try
    16. //          创建JSON解析对象(两条规则的体现:中括号用JSONArray,注意传入数据对象)
    17. new
    18. //          取得数组长度
    19. int
    20. //          回想数组的取值的方式? --->for循环遍历数组--->得到值
    21. for (int i = 0; i < length; i++) {  
    22. //              根据解析的数据类型使用该类型的get方法得到该值,打印输出
    23.                 String string = jArray.getString(i);  
    24. ",");  
    25.             }  
    26.   
    27. catch
    28. // TODO: handle exception
    29.         }  
    30.   
    31.   
    32.     }  
    33. }

    java json包含中文 解析失败_大括号_02

    组合类型的解析(一):
    • 例子: String json=”{‘name’:’李书豪’,’girlFriend’:{‘name’:’高圆圆’,’age’:18}}”;
    • 分析: 我们首先是解析外面的大括号的对象,然后,通过girlfFriend,获取到对应的被包含的里面大括号对象。所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值

    [java]  view plain  copy


      1. /**
      2.  * 创建一个Person用于接收解析数据,封装对应字段
      3.  * @author sKy°
      4.  * @date 2016-5-8
      5.  * @version 1.0
      6.  */
      7. public class
      8. //    分析我们要解析的对象,根据解析对象的属性值去创建对应的属性值
      9. //    根据分析我们所要解析的对象,两条属性 1.name(String类型) 2.是girlFrien(类类型,意味着还需要在类中去嵌套一个类(创建类部类也可))
      10.   
      11. //   封装字段
      12. private
      13. private GirlFriend girlFriend;  //类类型
      14. //   setter getter方法
      15. public
      16. return
      17.     }  
      18. public void
      19. this.name = name;  
      20.     }  
      21. public
      22. return
      23.     }  
      24. public void
      25. this.girlFriend = girlFriend;  
      26.     }  
      27.   
      28. //   toString方法用于控制台输出
      29. @Override
      30. public
      31. return "Person [name=" + name + ", girlFriend=" + girlFriend + "]";  
      32.     }  
      33.   
      34. }  
      35.   
      36. // 为了方便咱们看,这里就直接在下面创建了一个GirlFriend这个类
      37. class
      38. //   根据对象属性值,创建对应的值
      39. private
      40. private int
      41. //   setter getter方法
      42. public
      43. return
      44.     }  
      45. public void
      46. this.name = name;  
      47.     }  
      48. public int
      49. return
      50.     }  
      51. public void setAge(int
      52. this.age = age;  
      53.     }  
      54. //   toString方法用于控制台输出
      55. @Override
      56. public
      57. return "GirlFriend [name=" + name + ", age=" + age + "]";  
      58.     }  
      59.   
      60.   
      61.   
      62. }


      开始解析:

      [java]  view plain  copy

      1. import
      2. import
      3.   
      4.   
      5.   
      6.   
      7.   
      8. /**
      9.  * 组合数据类型的解析--->对象嵌套对象类型
      10.  * @author sKy°
      11.  * @date 2016-5-8
      12.  * @version 1.0
      13.  */
      14. public class
      15. public static void
      16. //      编辑一个我们要解析的数据对象
      17. //      分析: 应该先解析外面的大的对象,然后,通过girlfFriend,获取到对应的被包含的对象。
      18. //      所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值
      19.   
      20. "{'name':'李书豪','girlFriend':{'name':'高圆圆','age':18}}";  
      21. try
      22. //          1.创建JSON解析对象(两条规则的提现:大括号用JSONObject,注意传入数据对象)
      23. new
      24. //          2.实例化Person对象获取对应的值--->这里是获得外面大括号{}的name值 思考?里面{}如何获得?
      25. new
      26. "name");  
      27.             per.setName(name);  
      28. //          3.分析:里面{}是嵌套在外面大括号类的所以我们解析的对象是通过外面大括号去取得里面大括号值,注意看
      29. //取得对应里面大括号的girlFriend,取得name值,赋值给girlFriend对象
      30. new
      31. "girlFriend");  
      32. "name");  
      33.             girlFriend.setName(gfName);  
      34. //          获得age值并赋值
      35. int gfAge = jObj1.getInt("age");  
      36.             girlFriend.setAge(gfAge);  
      37. //          通过set把girlFriend的值赋Person 用于toString的输出,不然为空
      38.             per.setGirlFriend(girlFriend);  
      39. //          输出
      40.             System.out.println(per);  
      41. catch
      42.         e.printStackTrace();  
      43.     }  
      44.     }  
      45. }


      java json包含中文 解析失败_json_03


      小结: {[ {},{} ]}–>思路:第一步看到大括号:JSONObject去解,创建好对应里面的属性的值;第二步看到中括号:JSONArray去解析 对应创建好对应里面的属性值;第三步中括号里面的{},又是一个JSONObject。思路大致如此,强调注意的是,设置的属性值setXxx getXxx必须要和去获得值名称一致,不然会出错!!

      组合类型的解析(二):

      下面我们来解析一个略为复杂的JSON数据 

      要解析的数据如下:


      [java]  view plain  copy

      1. {  
      2. 'desc': 'OK',  
      3. 'status': 1000,  
      4. 'data': {  
      5. 'wendu': '20',  
      6. 'ganmao': '相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。',  
      7. 'forecast': [  
      8.             {  
      9. 'fengxiang': '北风',  
      10. 'fengli': '3-4级',  
      11. 'high': '高温 27℃',  
      12. 'type': '中雨',  
      13. 'low': '低温 19℃',  
      14. 'date': '6日星期五'
      15.             },  
      16.             {  
      17. 'fengxiang': '北风',  
      18. 'fengli': '微风级',  
      19. 'high': '高温 23℃',  
      20. 'type': '大雨',  
      21. 'low': '低温 17℃',  
      22. 'date': '7日星期六'
      23.             },  
      24.             {  
      25. 'fengxiang': '北风',  
      26. 'fengli': '微风级',  
      27. 'high': '高温 26℃',  
      28. 'type': '小雨',  
      29. 'low': '低温 17℃',  
      30. 'date': '8日星期天'
      31.             },  
      32.             {  
      33. 'fengxiang': '南风',  
      34. 'fengli': '微风级',  
      35. 'high': '高温 27℃',  
      36. 'type': '多云',  
      37. 'low': '低温 15℃',  
      38. 'date': '9日星期一'
      39.             },  
      40.             {  
      41. 'fengxiang': '南风',  
      42. 'fengli': '微风级',  
      43. 'high': '高温 29℃',  
      44. 'type': '多云',  
      45. 'low': '低温 16℃',  
      46. 'date': '10日星期二'
      47.             }  
      48.         ],  
      49. 'yesterday': {  
      50. 'fl': '微风',  
      51. 'fx': '北风',  
      52. 'high': '高温 33℃',  
      53. 'type': '阴',  
      54. 'low': '低温 22℃',  
      55. 'date': '5日星期四'
      56.         },  
      57. 'aqi': '58',  
      58. 'city': '成都'
      59.     }  
      60. }

      因为数据略大,不方便咱们看,这里给大家提供一个JSON在线解析工具http://json.phpddt.com/ 这是JSON在线高亮解析 ,可以很好的帮助咱们进行解析分析。下面是我用网页解析好的图片,可以思考下步骤(记住两条规则) 

      java json包含中文 解析失败_java json包含中文 解析失败_04

      分析: 

      java json包含中文 解析失败_json_05


      一:第一个大括号(JSONObject){”desc”: “status”: “data”} 

      二:大括号里面有一个大括号(JSONObject){”wendu”: “20”, “ganmao”: “forecast”: “yesterday”: “aqi”: “city”: } 

      三:第二个大括号里面有两个对象 1.数组形(JSONArray) 2.对象形( JSONObject ) 

      而数组形里面又套有数组的对象{} 。这就需要咱们在解析的时候需要很细致的去创建对应的属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!

      开始封装字段:


      [java]  view plain  copy

      1. import
      2.   
      3. /**
      4.  * 对应的字段的封装
      5.  * @author sKy°
      6.  * @date 2016-5-6
      7.  * @version 1.0
      8.  */
      9. public class
      10. //  外面大括号的字段封装 setter getter toString
      11. public
      12. public int
      13. public
      14. @Override
      15. public
      16. return "Weather [desc=" + desc + ", status=" + status + ", data="
      17. "]";  
      18.     }  
      19.   
      20.   
      21. }  
      22.   
      23. class
      24. //  里面大括号的字段封装 setter getter toString 
      25. //  该类中包含有数组形和对象形,需要一并的封装在里面
      26. public
      27. public
      28. public
      29. public
      30. public
      31. public
      32. @Override
      33. public
      34. return "Data [wendu=" + wendu + ", ganmao=" + ganmao + ", forecast="
      35. ", yesterday=" + yesterday + ", aqi="
      36. ", city=" + city + "]";  
      37.     }  
      38.   
      39.   
      40. }  
      41.   
      42. class
      43. //  数组里面的大括号类型字段的封装
      44. public
      45. public
      46. public
      47. public
      48. public
      49. public
      50. @Override
      51. public
      52. return "Forecast [fengxiang=" + fengxiang + ", fengli="
      53. ", high=" + high + ", type=" + type + ", low="
      54. ", date=" + date + "]";  
      55.     }  
      56.   
      57.   
      58. }  
      59. class
      60. //   最后{}的字段封装
      61. public
      62. public
      63. public
      64. public
      65. public
      66. public
      67. @Override
      68. public
      69. return "Yesterday [fl=" + fl + ", fx=" + fx + ", high="
      70. ", type=" + type + ", low=" + low + ", date=" + date + "]";  
      71.     }  
      72.   
      73. }


      开始解析:


      [java]  view plain  copy


      1. import
      2. import
      3.   
      4. import
      5. import
      6. import
      7.   
      8.   
      9.   
      10.   
      11. /**
      12.  * 组合类型二的解析
      13.  * @author sKy°
      14.  * @date 2016-5-6
      15.  * @version 1.0
      16.  */
      17. public class
      18. public static void main(String[] args) throws
      19.   
      20. //要解析的对象
      21. "{ 'desc': 'OK', 'status': 1000, 'data': { 'wendu': '20', 'ganmao': '相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。', 'forecast': [ { 'fengxiang': '北风', 'fengli': '3-4级', 'high': '高温 27℃', 'type': '中雨', 'low': '低温 19℃', 'date': '6日星期五' }, { 'fengxiang': '北风', 'fengli': '微风级', 'high': '高温 23℃', 'type': '大雨', 'low': '低温 17℃', 'date': '7日星期六' }, { 'fengxiang': '北风', 'fengli': '微风级', 'high': '高温 26℃', 'type': '小雨', 'low': '低温 17℃', 'date': '8日星期天' }, { 'fengxiang': '南风', 'fengli': '微风级', 'high': '高温 27℃', 'type': '多云', 'low': '低温 15℃', 'date': '9日星期一' }, { 'fengxiang': '南风', 'fengli': '微风级', 'high': '高温 29℃', 'type': '多云', 'low': '低温 16℃', 'date': '10日星期二' } ], 'yesterday': { 'fl': '微风', 'fx': '北风', 'high': '高温 33℃', 'type': '阴', 'low': '低温 22℃', 'date': '5日星期四' }, 'aqi': '58', 'city': '成都' } }";  
      22.   
      23. new
      24. //      首先看到的是一个{}所以用JSON Object来进行解析
      25. //      获得外部的Weather
      26. new
      27. "desc");  
      28. int status = obj.getInt("status");  
      29.         wea.status=status;  
      30.         wea.desc=desc;  
      31.   
      32. //      获得内部Data的数据
      33. "data");  
      34. new
      35. "wendu");  
      36. "ganmao");  
      37. "aqi");  
      38. "city");  
      39.         wea.data=data;  
      40. new
      41.   
      42. //      获取forecast数组
      43. "forecast");  
      44. for (int i = 0; i < jArr.length(); i++) {  
      45.             JSONObject obj2 = jArr.getJSONObject(i);  
      46. new
      47. "date");  
      48. "fengxiang");  
      49. "high");  
      50. "low");  
      51. "fengli");  
      52. "type");  
      53.             forecasts.add(forecast);  
      54.         }  
      55.         data.forecast=forecasts;  
      56. "yesterday");