精华内容
下载资源
问答
  • json 解析

    2013-04-01 17:02:47
    json 解析 for iOS JSONKit 官网 第三方库jsonkit 解析 (jsonkit文件) 综合比较json解析 sbjson,json,系统json解析
    展开全文
  • Json解析

    千次阅读 2015-10-15 19:38:11
    1.JSON解析 (1).解析Object之一: 1{“url”:”http://www.cnblogs.com/qianxudetianxia“} 解析方法: 1 2JSONObject demoJson = new JSONObject(jsonString); String url = demoJson.getString(“url”); (2)...

    1.JSON解析 (1).解析Object之一:
    1

    {“url”:”http://www.cnblogs.com/qianxudetianxia“}

      解析方法:
    1
    2

    JSONObject demoJson = new JSONObject(jsonString);
    String url = demoJson.getString(“url”);

      (2).解析Object之二:
    1

    {“name”:”android”,”name”:”iphone”}

      解析方法:
      
    JSONObject demoJson = new JSONObject(jsonString);
    String name = demoJson.getString(“name”);
    String version = demoJson.getString(“version”);
    System.out.println(“name:”+name+”,version:”+version);

     (3).解析Array之一:
    

    {“number”:[1,2,3]}

       解析方法:
      
    JSONObject demoJson = new JSONObject(jsonString);
    JSONArray numberList = demoJson.getJSONArray(“number”);
    for(int i=0; i

    JSONObject demoJson = new JSONObject(jsonString);
    JSONArray numberList = demoJson.getJSONArray("number");
    for(int i=0; i<numberList.length(); i++){
          //获取数组中的数组
          System.out.println(numberList.getJSONArray(i).getInt(0));
    }

    嵌套数组遍历

      (5).解析Object和Array:

    {“mobile”:[{“name”:”android”},{“name”:”iphone”}]}

      解析方法:


    JSONObject demoJson = new JSONObject(jsonString);
    JSONArray numberList = demoJson.getJSONArray("mobile");
    for(int i=0; i<numberList.length(); i++){
    System.out.println(numberList.getJSONObject(i).getString("name"));
    }

      所以,我们发现get后面接着的是你想要的得到的结果的类型:getType,这个对理解很有帮助。 (6).使用optType: 上面的例子,使用getType在碰到查找不到节点的时候,会抛出异常。 如果使用optType,找不到节点,则返回null或者默认值。

    //无url节点,抛出异常
    String url = demoJson.getString(“url”);
    //无url节点,返回空,如果为基本类型,则返回默认值
    String url = demoJson.optString(“url”);

      (7).UTF-8的BOM头导致解析JSON异常的问题 到json文件保存为utf-8的时候,在windows平台下,会产生bom头”EF BB EF”字节在文本的最前面(需要用十六进制工具打开才能看的到)。 有两种解决方法: a.使用UltraEdit打开json文件, 另存为的时候,选择格式UTF-8,无BOM头,如果还不行,在用记事本打开,另存为UTF-8下,多试几次就可以了。 b.使用代码处理,截取json主体内容:

    String jsonString = getJsonString();
    jsonString = jsonString.substring(jsonString.indexOf(“{“),jsonString.lastIndexOf(“}”)+1);

    展开全文
  • JSON 解析

    千次阅读 2016-05-19 11:47:10
    JSON 使用讲解 这篇文章讲解了,JSON的介绍以及使用GSON解析。今天,我们就在Android项目中使用两种方式解析JSON数据。如果你对JSON,还不熟悉,那么请看JSON 使用讲解。 一.搭建服务以及制造JSON数据。 1.服务器...

        JSON 使用讲解 这篇文章讲解了,JSON的介绍以及使用GSON解析。今天,我们就在Android项目中使用两种方式解析JSON数据。如果你对JSON,还不熟悉,那么请看JSON 使用讲解

    一.搭建服务以及制造JSON数据。

    1.服务器选择的Tomcat,下载链接。下载安装成功后,服务启动后,在浏览器中输入'http://localhost:8080/',看到如下截图,那就说明启动成功了。

    2.Tomcat服务器启动好后,找到它的安装目录‘D:\Apache Software Foundation\Tomcat 6.0\webapps’(我的安装目录是 ‘D:\Apache Software Foundation\Tomcat 6.0\webapps’),然后在该目录下,新建文件夹‘json’,在该文件夹中,创建文件‘get_data.json’,在该文件中输入JSON字符串,格式如下‘[{"id":1,"name":"zhangsan","age":30},{"id":2,"name":"lisi","age":20}]’。

    3.此时在浏览器中输入‘http://localhost:8080/json/get_data.json’,如果出现如下截图,说明上面的操作是成功的。

        经过上面3步,我们就把JSON数据创建好了,接下来就是Android客户端的实现了。

    二.Android客户端的实现。

    1.创建Android项目。这个不用详细描述了。

    2.首先记得在AndroidManifest.xml中加入网络权限。

     

    <uses-permission android:name="android.permission.INTERNET"/>

    3.网络请求实现。使用URLConnection实现的。

     

     

    public static String getData1(String urlStr) {
    		String resultData = "";
    		// 构造URL
    		try {
    			URL url = new URL(urlStr);
    			// 打开连接
    			URLConnection con = url.openConnection();
    			con.setConnectTimeout(10 * 1000);
    			con.setReadTimeout(10 * 1000);
    			InputStream is = con.getInputStream();
    			BufferedReader br = new BufferedReader(new InputStreamReader(is));
    			String line = null;
    			StringBuffer sb = new StringBuffer();
    			while ((line = br.readLine()) != null) {
    				sb.append(line);
    			}
    			resultData=sb.toString();
    			return resultData;
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    	}

    4.功能实现。

     

        在MainActivity中加入一个按钮,点击的时候获取网络数据,并且请求网络要在子线程中进行。有一点需要补充就是手机访问电脑时的IP地址,如果你使用手机访问电脑,IP地址还是‘localhost’,肯定是访问不了的,因为‘localhost’指的是本机,如果使用手机访问‘localhost’,那肯定是访问不到电脑的。这个IP可以有两种写法,一种是,当你使用模拟器访问的话,IP可以写成‘10.0.2.2’;另一种是,直接写为电脑在局域网内的IP地址,例如‘192.168.1.114’(我电脑的IP地址);建议直接写成电脑在局域网内的IP地址。详细实现如下代码所示,

     

    public class MainActivity extends Activity {
    
    	String url = "http://192.168.1.114:8080/json/get_data.json";
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		findViewById(R.id.btn_getdata).setOnClickListener(
    				new OnClickListener() {
    
    					@Override
    					public void onClick(View v) {
    						// TODO Auto-generated method stub
    						new MyThread().start();
    					}
    				});
    	}
    
    	class MyThread extends Thread {
    		@Override
    		public void run() {
    			String jsonStr = NetWorkUtils.getData1(url);
    			if (!TextUtils.isEmpty(jsonStr)) {
    				Log.e("jsonStr", jsonStr);
    				 parseJsonData(jsonStr);
    //				parseJsonData1(jsonStr);
    			}
    		}
    	}
    }

    解析JSON采用三种方式。

     

    5.使用JSONObject解析。代码很简单,就不多说了,示例如下,

     

    /**
    	 * 使用JSONArray和JSONObject解析
    	 * 
    	 * @param jsonStr
    	 */
    	private void parseJsonData(String jsonStr) {
    		try {
    			JSONArray array = new JSONArray(jsonStr);
    			for (int i = 0; i < array.length(); i++) {
    				JSONObject jsonObject = array.getJSONObject(i);
    				int id = jsonObject.getInt("id");
    				String name = jsonObject.getString("name");
    				int age = jsonObject.getInt("age");
    				Person person = new Person(id, name, age);
    				Log.e("person", person.toString());
    			}
    		} catch (JSONException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}

    6.使用GSON解析。代码就更简单,示例如下,

    /**
    	 * 使用GSON解析
    	 * 
    	 * @param jsonStr
    	 */
    	private void parseJsonData1(String jsonStr) {
    		Gson gson = new Gson();
    		List<Person> list = gson.fromJson(jsonStr,
    				new TypeToken<List<Person>>() {
    				}.getType());
    		for (Person person : list) {
    			Log.e("person", person.toString());
    		}
    	}

     

    7.使用JackJson解析,做了一个JackJson工具类,代码如下:

     

    /**
     * jackjson 
     */
    public class JackJsonUtils {
    
    	
    	/**
    	 * 解析
    	 * 
    	 * @param content
    	 * @param valueType
    	 * @return
    	 */
    	public static <T> T fromJson(String content, Class<T> valueType) {
    			ObjectMapper objectMapper = new ObjectMapper();
    		try {
    			return objectMapper.readValue(content, valueType);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 生成json
    	 * 
    	 * @param object
    	 * @return
    	 */
    	public static String toJSon(Object object) {
    		ObjectMapper objectMapper = new ObjectMapper();
    		try {
    			return objectMapper.writeValueAsString(object);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    }
    

    调用代码,

     

     

    	/**
    	 * jackjson解析
    	 * 
    	 * @param jsonStr
    	 */
    	public void parserByJackJson(String jsonStr) {
    		Person[] persons = JackJsonUtils.fromJson(jsonStr, Person[].class);
    		for (Person person : persons) {
    			Log.e("person", person.toString());
    		}
    	}

     

    运行后的截图如下,

    PS:也许你使用JackJson解析可能会报错,日志截图如下:

    解决方法是,在你的实体类中加入无参的构造函数就完美解决了!希望能帮到你!实体类的代码如下:

     

    public class Person implements Serializable {
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private int id;
    	private String name;
    	private int age;
    
    	public Person() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	public Person(int id, String name, int age) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    	}
    
    }

     

    三.总结。

        使用了三种方式去解析JSON数据。个人建议,如果你是在Android开发,建议使用GSON,毕竟是谷歌自己的东西,使用放心,可靠!如果你是做后台服务或者接口开发,建议使用JackJson,强大、快速!相信你现在已经对JSON解析有更深入的了解了!示例代码下载链接

    PS:推荐文章 java web开发(一) 环境搭建 

                          Android学习资料整理                     

                         Android WebView(一) WebView详解

                         json格式化工具

     

    最近才开通了微信公众号,欢迎大家关注。

     
    展开全文
  • json解析

    千次阅读 2017-12-13 14:28:04
    写在前面 ...因为前几晚跟好友 xiasuhuei321 探讨了一下GSON解析复杂的JSON的时候,能不能只解析源数据中的数组,甚至只解析数组的某一部分。探讨了二十分钟,得出结论:没用过,不知道。 所以今天特

    写在前面

    关于GSON的入门级使用,这里就不提了,如有需要可以看这篇博文 《Google Gson的使用方法,实现Json结构的相互转换》 ,写的很好,通俗易懂。

    我为什么写这篇文章呢?因为前几晚跟好友 xiasuhuei321 探讨了一下GSON解析复杂的JSON的时候,能不能只解析源数据中的数组,甚至只解析数组的某一部分。探讨了二十分钟,得出结论:没用过,不知道。

    所以今天特地研究了一下,发现真的So Easy!之前想复杂了,学习的过程中,发现有五种方式分别搞定不同情况的JSON数组,也就是今天说的五大招!

    在介绍之前先来个约定,比如下面的这个JSON:

    "muser": [
        {
          "name": "zhangsan",
          "age": "10",
          "phone": "11111",
          "email": "11111@11.com"
        },
        ...
    ]
    • 这里的 “muser” ,也就是数组的名称,称它为数据头,防止跟里面的 字段 有歧义;
    • 如果没有数据头,那就叫它纯数据,或者纯数组数据;
    • 代码中用到的 JsonArray/JsonObject 等熟悉的类全部来自 GSON 。

    开始过招吧!

    第一招 A

    没有数据头的纯数组JSON如何解析?

    根据约定,也就是这个 JSON 里面只有一个数组(JsonArray),而且这个数组没有名字,比如像下面这样的:

    [
      {
        "name": "zhangsan",
        "age": "10",
        "phone": "11111",
        "email": "11111@11.com"
      },
      {
        "name": "lisi",
        "age": "20",
        "phone": "22222",
        "email": "22222@22.com"
      },
      ...
    ]

    这里其实是最简单的一种 JSON 数组格式,强大的 GSON 可以直接解析成一个 List 。但在这里我先不直接解析,就用比较老实的方法去解析,因为需要引出两个东西。

    首先我们需要建立一个Bean对象,注意变量名要跟字段名称一致,没什么好说的:

    public class UserBean {
        //变量名跟JSON数据的字段名需要一致
        private String name ;
        private String age;
        private String phone;
        private String email;
        ...
    }

    下面这是解析过程,先看代码:

    /**
     * 解析没有数据头的纯数组
     */
    private void parseNoHeaderJArray() {
        //拿到本地JSON 并转成String
        String strByJson = JsonToStringUtil.getStringByJson(this, R.raw.juser_1);
    
        //Json的解析类对象
        JsonParser parser = new JsonParser();
        //将JSON的String 转成一个JsonArray对象
        JsonArray jsonArray = parser.parse(strByJson).getAsJsonArray();
    
        Gson gson = new Gson();
        ArrayList<UserBean> userBeanList = new ArrayList<>();
    
        //加强for循环遍历JsonArray
        for (JsonElement user : jsonArray) {
            //使用GSON,直接转成Bean对象
            UserBean userBean = gson.fromJson(user, UserBean.class);
            userBeanList.add(userBean);
        }
        mainLView.setAdapter(new UserAdapter(this, userBeanList));
    }

    从代码中可以看出解析的步骤如下:

    • 无论 JSON 来自本地还是网络获取,都要先将 JSON 转成 String ;
    • 需要一个 JSON 解析类对象将JSON的字符串转成 JsonArray ,前提是我们知道 JSON 中只有纯数组;
    • 循环遍历 JsonArray ,并用 GSON 解析成相应的对象。

    代码本身不难,容易看懂,但前面说到,这里我故意这样写,因为需要说两个东西:

    1、JsonParse

    从名称我们就可以看出,这是一个解析类。没错,它可以把 JSON 数据分别通过 getAsJsonObject 和 getAsJsonArray 解析成 JsonObject 和 JsonArray 。这跟普通的解析 JSON 差不多,不展开说。

    2、JsonElement

    这个类我是第一次见,它是一个抽象类,代表 JSON 串中的某一个元素,可以是 JsonObject/JsonArray/JsonPrimitive/… 中的任何一种元素。

    所以在上面的代码中,我们可以看到它能把 JsonArray 中的每一个元素转成 JsonObject ,甚至说它本身就是 JsonObject 。

    好了,就为了说这两个东西。记住,后面将会用到。

    来看一下运行的图吧,很简单的东西,后面的二三都是这样的效果,就不重复贴图了:

    第二招 Q

    有数据头的纯数组数据该怎么解析?

    内容跟上面的 JSON 一模一样,只不过加了一个名称 “muser” ,也就是约定好的 数据头 :

    {
      "muser": [
        {
          "name": "zhangsan",
          "age": "10",
          "phone": "11111",
          "email": "11111@11.com"
        },
        {
          "name": "lisi",
          "age": "20",
          "phone": "22222",
          "email": "22222@22.com"
        },
        ...
      ]
    }

    有人说,这还不简单,在第一招中的 getAsJsonArray 加一个字符串就是咯,就像这样:

    JsonArray jsonArray = parser.parse(strByJson).getAsJsonArray("muser");

    思路是对的,但是不要忘了,数组装在一个 { } 括起来的 JsonObject 里。还记得上面的 JsonParse 么,它的 getAsJsonObject 可以做到这点,所以代码就是这样啦,很简单就不再解释了:

    /**
     * 解析有数据头的纯数组
     */
    private void parseHaveHeaderJArray() {
        //拿到本地JSON 并转成String
        String strByJson = JsonToStringUtil.getStringByJson(this, R.raw.juser_2);
    
        //先转JsonObject
        JsonObject jsonObject = new JsonParser().parse(strByJson).getAsJsonObject();
        //再转JsonArray 加上数据头
        JsonArray jsonArray = jsonObject.getAsJsonArray("muser");
    
        Gson gson = new Gson();
        ArrayList<UserBean> userBeanList = new ArrayList<>();
    
        //循环遍历
        for (JsonElement user : jsonArray) {
            //通过反射 得到UserBean.class
            UserBean userBean = gson.fromJson(user, new TypeToken<UserBean>() {}.getType());
            userBeanList.add(userBean);
        }
        mainLView.setAdapter(new UserAdapter(this, userBeanList));
    }

    注意,这里又引出了一个东西: TypeToken ,它是什么呢?

    3、TypeToken

    这个东西很有意思,本来我不知道到是干嘛的,看了看源码,看不懂。后来无意发现它所在的包:

    import com.google.gson.reflect.TypeToken;

    哎哟我去, reflect 这不是反射么,一下子就明白了。没错,它其实是一个匿名内部类,看一下官方解释:

    GSON 提供了 TypeToken 这个类来帮助我们捕获(capture)像 List 这样的泛型信息。Java编译器会把捕获到的泛型信息编译到这个匿名内部类里,然后在运行时就可以被 getType() 方法用反射的 API 提取到。

    解释的很官方,实际上就是一句 通俗但不严谨 的话,它将泛型 T 转成 .class 。比如上面的 TypeToken 经过 getType() 后就是 UserBean.class 。

    好了,说到这里基本铺垫就完成了,再次强调一下:

    对于上面的 JSON 完全可以直接通过 GSON 转成 List ,不用这么麻烦,我只是为了引出3个小知识。

    第三招 W

    有数据头的复杂数据该如何解析呢?

    简单的说完了,铺垫也铺完了,来看一看复杂的吧:

    {
      "code": 200,
      "msg": "OK",
      "muser": [
        {
          "name": "zhangsan",
          "age": "10",
          "phone": "11111",
          "email": "11111@11.com"
        },
        {
          "name": "lisi",
          "age": "20",
          "phone": "22222",
          "email": "22222@22.com"
        },
        ...
      ]
    }

    这里就不再是纯数组数据了,还有两个凑数的不知道干嘛用的字段,这里也有数据头,之前用的是笨方法,现在来真正见识一下GSON的威力吧。

    第一步根据 JSON 建立 Bean ,注意这里的 Bean 是返回所有字段,因为 GSON 能直接解析成 List ,所以 Bean 是下面这样的,同样把占地方的 get/set 省略:

    /**
     * Created by xiarui on 2016/8/30.
     * 返回所有结果的Bean
     */
    public class ResultBean {
        //注意变量名与字段名一致
        private int code;
        private String msg;
        private List<UserBean> muser;
    
        public class UserBean{
            private String name ;
            private String age;
            private String phone;
            private String email;
            ...
        }
        ...
    }

    注意,这个 ResultBean 里面有一个 UserBean 。 它虽然跟上面第一第二招虽然内容一样,但是作用不一样,这是作为 JsonArray 解析后存入 List 中的对象。

    算了,有点拗口,直接上代码吧:

    /**
     * 有消息头 复杂数据 常规方式
     */
    private void parseComplexJArrayByCommon() {
        //拿到Json字符串
        String strByJson = JsonToStringUtil.getStringByJson(this, R.raw.juser_3);
        //GSON直接解析成对象
        ResultBean resultBean = new Gson().fromJson(strByJson,ResultBean.class);
        //对象中拿到集合
        List<ResultBean.UserBean> userBeanList = resultBean.getMuser();
        //展示到UI中
        mainLView.setAdapter(new ResultAdapter(this, userBeanList));
    }

    没错,就是这么四句话搞定第一二招的内容。看出GSON的强大了吧,当然如果有人想不开只写一句话的话:

    mainLView.setAdapter(new ResultAdapter(this,new Gson().fromJson(JsonToStringUtil.getStringByJson(this,R.raw.juser_3),ResultBean.class).getMuser()));

    我也是没意见的,不过请对自己好一点,谢谢。

    第四招 E

    只想解析复杂JSON中的数组或数组中的某部分内容怎么办?

    好了,来到重点了,这也是跟好友 xiasuhuei321 没有讨论出来的情况。

    还是上面的JSON数据,这里为了篇幅就不贴重复代码了,假如我只想取 “muser” 这个数组中的年龄(age)大于30岁的怎么办?

    OK,当然可以先全部解析,再从 List 中取。那假如我有一万条数据呢?全部解析不是很麻烦呢?

    所以一个思路就是第一二招中说的: 遍历!

    OK,你会问先遍历还不是要读一万条,是的,还是要读一万条,但是假如我要把这些存入数据库呢?假如一万条数据中只有一条符合条件,难道我先存一万条,再从数据库中查询么?

    当然这种情况是极端情况,但也说明了一个问题,不能所有情况下都先全部解析,假如有一万个字段,Bean还得写多长…可怕。

    现在来说一下完整的思路,也是我学习中思考的过程:

    • 第一点肯定就是刚才提到的遍历,这个很好理解,所以我们先要取这一个数组(JsonArray),那么如何取呢?还记得之前提到的 JsonParse 么,它的 getAsJsonArray() 可以传入 数据头 拿到数组,当然不要忘了最外面一层是个 JsonObject 。
      //最外层
      JsonObject jsonObject = new JsonParser().parse(strByJson).getAsJsonObject();
      //需要遍历的数组
      JsonArray jsonArray = jsonObject.getAsJsonArray("muser");
    • 拿到数组以后,我们就可以遍历了,经过第一二招的洗礼,相信在遍历上,应该没什么问题了,使用的还是之前提到的 JsonElement 。
      //循环遍历数组
      for (JsonElement user : jsonArray) {
          UserBean userBean = new Gson().fromJson(user, new TypeToken<UserBean>() {}.getType());
          //根据条件过滤
          if (Integer.parseInt(userBean.getAge()) > 30) {
              userBeanList.add(userBean);
          }
      }
    • 上面的代码很简单,也用到了之前提到的 TypeToken ,什么意思就不用解释了吧。

    好了,完整的代码如下:

    /**
     * 有数据头 复杂数据 截取方式
     */
    private void parseComplexJArrayByDirect() {
        //拿到JSON字符串
        String strByJson = JsonToStringUtil.getStringByJson(this, R.raw.juser_3);
        List<UserBean> userBeanList = new ArrayList<>();
    
        //拿到数组
        JsonObject jsonObject = new JsonParser().parse(strByJson).getAsJsonObject();
        JsonArray jsonArray = jsonObject.getAsJsonArray("muser");
    
        //循环遍历数组
        for (JsonElement user : jsonArray) {
            UserBean userBean = new Gson().fromJson(user, new TypeToken<UserBean>() {
            }.getType());
            //根据条件过滤
            if (Integer.parseInt(userBean.getAge()) > 30) {
                userBeanList.add(userBean);
            }
        }
        mainLView.setAdapter(new UserAdapter(this, userBeanList));
    }

    运行的结果图如下:

    可以看到,现在我们做到了只取 JSON 数据中数组中某一部分了。那么扩展一下,只取 JSON 数据中的某一个数组中的某一个字段呢?当然可以实现,不过还是留给大家自己思考吧,当然下面反人类的第五招也是可以解决这个问题的。

    第五招 R

    如果一个 JSON 数据很很很复杂怎么解析?

    什么叫做复杂,这里我简单写了个比较复杂的,有数据头,一层嵌套一层,我还没有写数组呢:

    {
      "group": {
        "user": {
          "name": "张三",
          "age": "10",
          "phone": "11111",
          "email": "11111@11.com"
        },
        "info": {
          "address": "北京",
          "work": "Android Dev",
          "pay": "10K",
          "motto": "先定一个小目标,比如我先赚一个亿"
        }
      }
    }

    三种方式解析:

    • 第三招,全部解析出来;
    • 第四招,要什么解析什么;
    • 第五招,反人类的 JsonReader 。

    至于为什么反人类,不好说。大家看代码就知道了,代码很简单,跟 XML 的解析差不多,是根据节点来的,至于怎么用,还是那句话直接看代码吧,确实处理起来逻辑清晰,但是代码量上,真的不敢恭维。

    只贴代码不作解释,如想详细了解,看文末链接。

    /**
     * 通过JsonReader的方式去解析
     */
    private void parseComplexJArrayByReader() throws IOException {
        String strByJson = JsonToStringUtil.getStringByJson(this, R.raw.juser_4);
        JsonReader reader = new JsonReader(new StringReader(strByJson));
        try {
            reader.beginObject();
            String tagName = reader.nextName();
            if (tagName.equals("group")) {
                //读group这个节点
                readGroup(reader);
            }
            reader.endObject();
        } finally {
            reader.close();
        }
    }
    
    /**
     * 读group这个节点
     *
     * @param reader JsonReader
     */
    private void readGroup(JsonReader reader) throws IOException {
        reader.beginObject();
        while (reader.hasNext()) {
            String tagName = reader.nextName();
            if (tagName.equals("user")) {
                readUser(reader);
            } else if (tagName.equals("info")) {
                readInfo(reader);
            }
        }
        reader.endObject();
    }
    
    /**
     * 读用户基本消息 user节点
     *
     * @param reader JsonReader
     */
    private void readUser(JsonReader reader) throws IOException {
        reader.beginObject();
        while (reader.hasNext()) {
            String tag = reader.nextName();
            if (tag.equals("name")) {
                String name = reader.nextString();
                nameText.setText(name);
            } else if (tag.equals("age")) {
                String age = reader.nextString();
                ageText.setText(age);
            } 
            ...
            else {
                reader.skipValue();//忽略
            }
        }
        reader.endObject();
    }
    
    /**
     * 读用户其他消息 info节点
     *
     * @param reader JsonReader
     */
    private void readInfo(JsonReader reader) throws IOException {
        reader.beginObject();
        while (reader.hasNext()) {
            String tag = reader.nextName();
            if (tag.equals("address")) {
                String address = reader.nextString();
                addressText.setText(address);
            } else if (tag.equals("work")) {
                String work = reader.nextString();
                workText.setText(work);
            } 
            ...
            else {
                reader.skipValue();//忽略
            }
        }
        reader.endObject();
    }

    上面代码有省略,因为好长…运行图如下:

    五招过完,多谢指教!

    原文地址:http://www.open-open.com/lib/view/open1472632967912.html
    展开全文
  • Java Json解析,Java Web Json解析,Java Web服务端获取Json数据,客户端通过HTTP获取Json数据
  • Android客户端与服务器端交互数据之json解析

    万次阅读 多人点赞 2016-02-03 01:42:32
    服务器端的工作就是将特定的数据类型转换为json字符串,然后客户端再将json字符串转换成原来的类型,所以json解析是跨平台数据格式转换的一个桥梁, 这里以最常用的对象类型,list包裹对象类型,list包裹String类型...
  • Csharp Json解析

    千次阅读 2017-08-10 15:39:30
    新建工程 Json解析 : using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using LitJson; using System.IO; namespace Json解析 { class ...
  • JSON解析(C++)

    万次阅读 2019-08-21 17:20:33
    本文主要介绍使用 jsoncpp 库,编写C++语言的 JSON 解析程序。 1概述 jsoncpp 是一个可以与 JSON 进行交互的C++库。官网定义如下: jsoncpp is an implementation of a JSON reader and writer in C++. 通过使用...
  • json解析错误

    千次阅读 2018-03-19 10:43:40
    当出现这种json解析错误的时候,大家查找的时候不仅仅要查找是否是 double 字段去解析空串了 还有可能是 int 是long 1,大家在解析数据时候 尽量使用String来解析 2,json数据类型一样的或...
  • Golang json解析

    千次阅读 2017-04-05 17:55:07
    对于json解析的一点小坑...  1) 返回字段数 等于 定义struct 数 见代码:package main import ( "encoding/json" "fmt" "strings" ) type GetResponse struct { Message string `json:message` Success int ...
  • 对象解析json之一句话 Json解析之JsonArray 附加Gson生成与解析 Json解析之JsonArray String str = "{\"phone\" : [\"12345678\", \"87654321\"]}";
  • Flutter(二十)——JSON解析

    万次阅读 2020-02-10 17:43:00
    前一篇博文已经详细介绍了Flutter开发中的网络请求,但其实大多数项目中,返回HTML内容是不够的,因为移动端使用的最多的请求是JSON数据,所以我们需要掌握Flutter开发中,JSON解析的知识。(JSON(javaScript Object...
  • SQL SERVER Json 解析方法

    万次阅读 2018-09-25 10:45:02
    整理记录一个Json解析的函数方法,方法如下: Create FUNCTION [dbo].[parseJSON]( @JSON NVARCHAR(MAX)) RETURNS @hierarchy TABLE ( element_id INT IDENTITY(1, 1) NOT NULL, /* internal surrogate ...
  • json解析原理

    千次阅读 2016-05-25 17:51:39
    json解析原理之Gson目标:了解json对象解析的大概过程 在这个序列化和反序列化的过程中,Gson充当的了一个解析器的角色。 第一阶段:了解Gson数据类型及其关系 第一:JsonElement(超级父类) 看JsonElement类的源码...
  • JSON解析之原生解析

    千次阅读 2016-07-30 14:57:34
    JSON解析之原生解析 JSON是首先一种数据结构,说白了就是对数据的描述,刚刚出现是为了取代XML可惜并没有,但是在做为配置文件上,却是很好,由于它小巧灵活 描述数据很好,所以在网络上进行数据传输更加方便请记住...
  • springboot的Json解析

    万次阅读 2018-05-02 18:26:01
    Demo下载地址:https://download.csdn.net/download/qq_36522306/10387613本文分别以demo的形式来说说springboot默认的Json解析和使用FastJson工具解析springboot默认的解析方式为jackson,建立maven项目后,可在...
  • iOS json解析 和生成json串

    万次阅读 2014-12-17 16:32:52
    IOS JSON解析
  • JSON解析】浅谈JSONObject的使用

    万次阅读 多人点赞 2020-03-25 17:22:27
    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构...
  • Gson解析json,让json解析不再困难

    万次阅读 2016-05-04 12:30:12
    json解析,当然有很多办法,今天要讲的是用 Gson 解析 json,首先需要引用 jar 包,下载地址为:  http://mvnrepository.com/artifact/com.google.code.gson/gson 此处,我用的是 gson-2.6.2.jar 先往自己的项目中...
  • Python JSON 解析

    千次阅读 2015-10-31 20:58:48
    Python中JSON解析Python2.6开始加入了JSON模块。 Python的JSON模块序列化和反序列化分别是encoding和decoding。 encoding :将一个Python对象编码成JSON字符串。 decoding:将JSON格式字符串解码成Python对象。 对...
  • oracle json 解析函数

    千次阅读 2015-11-16 09:46:22
    oracle json 解析函数
  • 通过JSON解析下来的数据显示在LIstView中,如何实现点击具体项目,进入点击项详情,如何将JSON的数据传递到下一页面 JSON如何获得指定项的数据
  • SpringBoot默认的json解析方案

    千次阅读 2020-01-02 22:12:16
    SpringBoot默认的json解析方案HttpMessageConverterSpringBoot默认的json解析方案自定义日期字段格式化 HttpMessageConverter HttpMessageConverter是一个消息转换工具,有两方面的功能: 1.将服务端返回的对象序列...
  • 什么是json? 懵逼回答:【参考菜鸟教程】   a.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)   b.JSON 是轻量级的文本数据交换格式...JSON 解析器和 JSON 库支持许多不同的编程语言。 目前...
  • Java 常用 Json 解析框架

    千次阅读 2019-02-21 22:36:45
    常见json解析框架: fastjson gson jackson 1. fastjson maven 引用: &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;fastjson...
  • Android解析——json解析为javabean

    千次阅读 2016-03-28 01:44:51
    json的解析,归根结底就是用JsonObject以及JsonArray来实现的...这里介绍下用Gson类来将json解析为javabean。 用两个json字符串来分析: 一、简单json字符串的解析 String JSON_SIMPLE_STRING="{\"sitename\":\"JSO
  • Java后台JSON解析前台传入的数组JSON字符串
  • 关于ESP8266 json解析

    千次阅读 2018-07-23 10:37:40
    esp8266 json解析中api只是给了一个简单的函数说明,很难理解他具体使用方法,无意间发现他们使用的是contiki的json解析,从contiki官网上找到源码,希望对学习的人有帮助。   文件无法上传,各位可以到contiki...
  • Android项目之JSON解析

    千次阅读 2018-12-26 15:24:00
    Android项目之JSON解析 JSON JSON 是用于存储和传输数据的格式,通常用于服务端向网页传递数据 JSON英文全称 JavaScript Object Notation(JavaScript 对象表示法),是一种轻量级的用于存储和交换文本信息的语法,被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,418
精华内容 26,167
关键字:

json解析