所谓json,其实就是在我们访问一个网页的接口的时候,服务器端传送给我们客户端的一种数据的结构,当然我们向服务器端发送的数据有时也会转换成json格式,当然了,这不是必须的。最近在解析一些json字符串,所以就贴出一些代码,也方便以后自己复习和使用。

首先先来一些简单的吧。

对一个json对象进行解析:

字符串原串是这样的:String json={“Persons”:[{“address”:”河南”,”name”:”郭XX”,”id”:201492115},{“address”:”大连”,”name”:”unName”,”id”:201492111}]},(我这里声明为String是不正确的格式,知识为了看起来方便)很明显可以看出在Persons这个key是对应一个数组的,而数组的内容则是一个对象,对象有三个成员变量address,name,id,每一个也都对应相应的value,下面让我们开始正式的解析吧,

代码如下:

  1. public class TestJson {
  2. public TestJson() {
  3. // TODO Auto-generated constructor stub
  4. }
  5. public static void main(String []args){
  6. JsonService jsonService=new JsonService();
  7. // Person person=(Person) jsonService.getPerson();
  8. try {
  9. String message=JsonTools.createJsonObject("Persons", jsonService.getListString());
  10. System.out.println(message);
  11. JSONObject jsonObject=new JSONObject(message);
  12. JSONArray jsonArray=jsonObject.getJSONArray("Persons");
  13. for(int i=0;i<jsonArray.length();i++){
  14. Person p=new Person();
  15. int id;
  16. String name="";
  17. String address="";
  18. address=jsonArray.getJSONObject(i).getString("address");
  19. name=jsonArray.getJSONObject(i).getString("name");
  20. id=Integer.parseInt(jsonArray.getJSONObject(i).getString("id"));
  21. p.setAddress(address);
  22. p.setId(id);
  23. p.setName(name);
  24. System.out.println("Person:"+p.toString());
  25. }
  26. } catch (JSONException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }
  31. }

下面是解析的结果:

  1. Person:Person [id=201492115, name=郭XX, address=河南]
  2. Person:Person [id=201492111, name=unName, address=大连]

其中大致的原理是这样的,我们先声明一个JSONObject对象,然后将要进行解析的json字符串传进去,由于要解析的内容并非一个简单的键值对,而是一个对象,所以要使用JSONArray来获得一个数组,当然了,数组的获得还是需要依靠JsonObject对象的,然后对数组内每一个字符串对应的内容进行分别得解析就好了。

下面我会写一个比较复杂的json的解析过程(稍微有些bug,请不要介意啊,只是展示这么个思想,如果,博友们有好的方式,希望多多留言啊),接口传回的是一个json字符串,具体如下,{“error”:0,”status”:”success”,”date”:”2015-10-16”,”results”:[{“currentCity”:”成都”,”pm25”:”173”,”index”:[{“title”:”穿衣”,”zs”:”舒适”,”tipt”:”穿衣指数”,”des”:”建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。”},{“title”:”洗车”,”zs”:”不宜”,”tipt”:”洗车指数”,”des”:”不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。”},{“title”:”旅游”,”zs”:”适宜”,”tipt”:”旅游指数”,”des”:”天气较好,但丝毫不会影响您出行的心情。温度适宜又有微风相伴,适宜旅游。”},{“title”:”感冒”,”zs”:”较易发”,”tipt”:”感冒指数”,”des”:”昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。”},{“title”:”运动”,”zs”:”适宜”,”tipt”:”运动指数”,”des”:”天气较好,赶快投身大自然参与户外运动,尽情感受运动的快乐吧。”},{“title”:”紫外线强度”,”zs”:”弱”,”tipt”:”紫外线强度指数”,”des”:”紫外线强度较弱,建议出门前涂擦SPF在12-15之间、PA+的防晒护肤品。”}],”weather_data”:[{“date”:”周五 10月16日 (实时:26℃)”,”dayPictureUrl”:”http://api.map.baidu.com/images/weather/day/duoyun.png“,”nightPictureUrl”:”http://api.map.baidu.com/images/weather/night/xiaoyu.png“,”weather”:”多云转小雨”,”wind”:”南风微风”,”temperature”:”25 ~ 18℃”},{“date”:”周六”,”dayPictureUrl”:”http://api.map.baidu.com/images/weather/day/xiaoyu.png“,”nightPictureUrl”:”http://api.map.baidu.com/images/weather/night/xiaoyu.png“,”weather”:”小雨”,”wind”:”北风微风”,”temperature”:”23 ~ 17℃”},{“date”:”周日”,”dayPictureUrl”:”http://api.map.baidu.com/images/weather/day/duoyun.png“,”nightPictureUrl”:”http://api.map.baidu.com/images/weather/night/duoyun.png“,”weather”:”多云”,”wind”:”南风微风”,”temperature”:”26 ~ 15℃”},{“date”:”周一”,”dayPictureUrl”:”http://api.map.baidu.com/images/weather/day/duoyun.png“,”nightPictureUrl”:”http://api.map.baidu.com/images/weather/night/yin.png“,”weather”:”多云转阴”,”wind”:”南风微风”,”temperature”:”26 ~ 18℃”}]}]}

是很复杂吧,反正一开始看,就觉得这什么啊,简直太乱了,但是我们仔细的查看一下,发现这个还是有很清晰的结构的,无非数组里面有潜逃了几层对象嘛,话不多说,直接上代码吧。

  1. package com.tiger;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.net.MalformedURLException;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import org.json.JSONArray;
  12. import org.json.JSONException;
  13. import org.json.JSONObject;
  14. import org.json.JSONTokener;
  15. public class TestSSDut {
  16. public TestSSDut() {
  17. // TODO Auto-generated constructor stub
  18. }
  19. public static String loadJson (String url) {
  20. StringBuilder json = new StringBuilder();
  21. try {
  22. URL urlObject = new URL(url);
  23. URLConnection uc = urlObject.openConnection();
  24. BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(),"utf-8"));
  25. String inputLine = null;
  26. while ( (inputLine = in.readLine()) != null) {
  27. json.append(inputLine);
  28. }
  29. in.close();
  30. } catch (MalformedURLException e) {
  31. e.printStackTrace();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. return json.toString();
  36. }
  37. public static String JsonComplier(String jsonString) throws JSONException{
  38. return null;
  39. }
  40. public static void main(String []args){
  41. String json=loadJson("http://api.map.baidu.com/telematics/v3/weather?location=%E6%88%90%E9%83%BD&output=json&ak=rnm8udmHdWaHFWZTO2tuTiG8");
  42. System.out.println(json);
  43. String result;
  44. try {
  45. String str="";
  46. JSONTokener jsonParser = new JSONTokener(json);
  47. // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。
  48. // 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String)
  49. JSONObject person = (JSONObject) jsonParser.nextValue();
  50. // 接下来的就是JSON对象的操作了
  51. String error=person.getString("error");
  52. String status=person.getString("status");
  53. String date=person.getString("date");
  54. str+="error="+error+" status="+status+" date="+date;
  55. System.out.println(str);
  56. JSONArray jsonArray=person.getJSONArray("results");
  57. for(int i=0;i<jsonArray.length();i++){
  58. String currentCity=jsonArray.getJSONObject(i).getString("currentCity");
  59. System.out.println("currentCity="+currentCity);
  60. String pm2_5=jsonArray.getJSONObject(i).getString("pm25");
  61. System.out.println("pm2_5="+pm2_5);
  62. JSONArray index=jsonArray.getJSONObject(i).getJSONArray("index");
  63. for(int j=0;j<index.length();j++){
  64. String title=index.getJSONObject(i).getString("title");
  65. System.out.println(title);
  66. String zs=index.getJSONObject(i).getString("zs");
  67. System.out.println(zs);
  68. String tipt=index.getJSONObject(i).getString("tipt");
  69. System.out.println(tipt);
  70. String des=index.getJSONObject(i).getString("des");
  71. System.out.println(des);
  72. }
  73. JSONArray weather_data=jsonArray.getJSONObject(i).getJSONArray("weather_data");
  74. for(int j=0;j<weather_data.length();j++){
  75. String datee=weather_data.getJSONObject(i).getString("date");
  76. System.out.println(datee);
  77. String dayPictureUrl=weather_data.getJSONObject(i).getString("dayPictureUrl");
  78. System.out.println(dayPictureUrl);
  79. String nightPictureUrl=weather_data.getJSONObject(i).getString("nightPictureUrl");
  80. System.out.println(nightPictureUrl);
  81. String weather=weather_data.getJSONObject(i).getString("weather");
  82. System.out.println(weather);
  83. String wind=weather_data.getJSONObject(i).getString("wind");
  84. System.out.println(wind);
  85. String temperature=weather_data.getJSONObject(i).getString("temperature");
  86. System.out.println(temperature);
  87. }
  88. }
  89. } catch (JSONException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }
  93. }
  94. public static List<String> getJsonArrayValue(String jsonString) throws JSONException{
  95. JSONObject demoJson = new JSONObject();
  96. JSONArray numberList = demoJson.getJSONArray(jsonString);
  97. List<String>list=new ArrayList<String>();
  98. for(int i=0; i<numberList.length(); i++){
  99. //获取数组中的数组
  100. list.add(String.valueOf(numberList.getJSONArray(i).getInt(0)));
  101. }
  102. return list;
  103. }
  104. }

下面是我解析出来的结果:

  1. error=0 status=success date=2015-10-16
  2. currentCity=成都
  3. pm2_5=173
  4. 穿衣
  5. 舒适
  6. 穿衣指数
  7. 建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。
  8. 周五 1016 (实时:26℃)
  9. http://api.map.baidu.com/images/weather/day/duoyun.png
  10. http://api.map.baidu.com/images/weather/night/xiaoyu.png
  11. 多云转小雨
  12. 南风微风
  13. 25 ~ 18
  14. 周五 1016 (实时:26℃)
  15. http://api.map.baidu.com/images/weather/day/duoyun.png
  16. http://api.map.baidu.com/images/weather/night/xiaoyu.png
  17. 多云转小雨
  18. 南风微风
  19. 25 ~ 18
  20. 周五 1016 (实时:26℃)
  21. http://api.map.baidu.com/images/weather/day/duoyun.png
  22. http://api.map.baidu.com/images/weather/night/xiaoyu.png
  23. 多云转小雨
  24. 南风微风
  25. 25 ~ 18
  26. 周五 1016 (实时:26℃)
  27. http://api.map.baidu.com/images/weather/day/duoyun.png
  28. http://api.map.baidu.com/images/weather/night/xiaoyu.png
  29. 多云转小雨
  30. 南风微风
  31. 25 ~ 18

解析出来的数据不是很全面。但我们还是来看一下这个思想吧。

我们一开始声明了一个JSONObject 名为person,这就是那个json字符串的最外边一层的key,接下来的操作需要依靠它来进行。对于解析过程,我们的思想就是:

1、对于直接的key我们可以直接获得对应的值,

2、对于对象,我们就需要借助JSONArray,来进行单独的处理,以获得所有的键值。

3、还有最重要的是,根据person获得的JsonObject 只能使用一次,对于对象里面的对象我们就需要使用该数组来再次获得一个数组,再对新的数组进行键值的处理即可。

好了,差不多就是这样了。本人能力有限,还望博友们多多提携,让我们一起进步吧。

我的Json解析实战的更多相关文章

  1. Flutter实战视频-移动电商-22.JSON解析和复杂数据模型转换技巧

    22.JSON解析和复杂数据模型转换技巧 json转Model类 创建model文件夹,在里面新建category.dart类 主要根据这个json来分析我们要做成类的样子 { ", &qu ...

  2. 【JSON解析】JSON解析

    前三篇博客分别介绍了xml的三种解析方法,分别是SAX,DOM,PULL解析XML,兴趣的朋友可以去看一下这[XML解析(一)]SAX解析XML,[XML解析(二)]DOM解析XML,[XML解析(三 ...

  3. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  4. Json解析工具的选择

    前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson ...

  5. iOS json 解析遇到error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed.

    Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 38 ...

  6. Android之JSON解析

    做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...

  7. Android总结之json解析(FastJson Gson 对比)

    前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...

  8. JSON解析和XML解析对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...

  9. iOS json解析的几种方法 NSJSONSerialization,JSONKit,SBJson ,TouchJson

    相关的第三方类库大家可以去github上下载 1.NSJSONSerialization 具体代码如下 : - (void)viewDidLoad { [super viewDidLoad]; NSD ...

随机推荐

  1. 如何找回Oracle所有用户丢失的密码

    如何找回Oracle所有用户丢失的密码: 方法一:1.以操作系统验证的方式登录 SQL>conn / as sysdba; 2.查看系统中的用户名. SQL>select USERNAME ...

  2. Django Model field reference

    ===================== Model field reference ===================== .. module:: django.db.models.field ...

  3. 安卓高级8 SurfaceView案例二 自定义相机

    效果:(由于不好录屏所以文字描述) 定一个SurfaceView 下方有几个按钮,点击确定可以拍照保存取消. 并且SurfaceView实时显示相机内容 package qianfeng.com.cu ...

  4. Lucene查询索引

    索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这 ...

  5. STATE(状态)模式

    引子 场景 在我们软件开发的过程中,有许多对象是有状态的.而对象的行为会随着状态的改变而发生改变.例如开发一个电梯类,电梯有开门.关门.停止.运行等行为,同时电梯也会有开门状态.关门状态.停止状态.运 ...

  6. CentOS7下安装GitLab

    三步在CentOS7系统下,完成GitLab的安装. 1.安装和配置必须的依赖 sudo yum install curl policycoreutils openssh-server openssh ...

  7. PGM:贝叶斯网的参数估计

    http://blog.csdn.net/pipisorry/article/details/52578631 本文讨论(完备数据的)贝叶斯网的参数估计问题:贝叶斯网的MLE最大似然估计和贝叶斯估计. ...

  8. JVM远程DEBUG(JPDA )

    原理 1. JPDA简介 JPDA(Java Platform Debugger Architecture)为Java平台上的调试器定义了一个标准的体系结构.该体系结构包括3个主要组成部分:JVM T ...

  9. 一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。 高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)。

    //点数 #define N 10 //点间距 int D[N]; //A1到每个Ai的距离 int A1ToX[N]; void preprocess() { srand(time(0)); //随 ...

  10. Scikit-learn:scikit-learn快速教程及实例

    http://blog.csdn.net/pipisorry/article/details/52251305 :7] y = dataset[:,8] 我们将在下面所有的例子里使用这个数据组,换言之 ...