Json数据解析

    |     2015年8月11日   |   网络通讯   |     0 条评论   |    1846

JSON 是轻量级数据交换格式,完全独立于语言的文本,人好读、机器好解析。支持 C、C++、C#、Java、JavaScript、Perl、Python 等。对象是无序的「名称/值」集合:{ 开始 } 结束,名称后跟冒号,对之间用逗号分隔。


一、JSON 书写格式

╬в╨┼╜╪═╝_20210412105246

  1. 映射用冒号:名称:值
  2. 并列数据用逗号:名称1:值1,名称2:值2
  3. 对象用大括号:{名称1:值,名称2:值2}
  4. 数组用方括号:[ {…}, {…} ]
  5. 元素类型:string, number, object, array, true, false, null
例1、{ "name": "Obama"}

例2、{ "name": "Romney","age": 56}

例3、{ "city":{"name": "bj"},"weatherinfo":{"weather": "sunny"}}

例4、{
"city":{"name": "北京","city_id":"101010100"},
"weatherinfo":{"weather": "sunny","temp":"29度"}
}

例5、
[
  { "name": "张三", "age":22, "email": "zhangsan@qq.com" },
  { "name": "李四", "age":23, "email": "lisi@qq.com"},
  { "name": "王五", "age":24, "email": "wangwu@qq.com" }
]

例6、
{ "student":
  [
    { "name": "张三", "age":22, "email": "zhangsan@qq.com" },
    { "name": "李四", "age":23, "email": "lisi@qq.com"},
    { "name": "王五", "age":24, "email": "wangwu@qq.com" }
  ]
}

二、Android 里解析 JSONObject / JSONArray

JSONObject

服务器上有 http://www.weather.com.cn/data/sk/101010100.html:

{"weatherinfo":
   {"city":"北京","cityid":"101010100","temp":"21","WD":"东南风"
    ,"WS":"2  级","SD":"78%","WSE":"2","time":"21:10","isRadar":"1"
    ,"Radar":"JC_RADAR_AZ9010_JB"}
}
  1. 读响应流,得到 json 字符串
  2. 构造函数转成 JSONObject
  3. 按键取值
InputStream in = conn.getInputStream();
String jsonStr = DataUtil.Stream2String(in);

JSONObject jsonObject = new JSONObject(jsonStr);

JSONObject json = jsonObject.getJSONObject("weatherinfo");
String city = json.getString("city");
String temp = json.getString("temp");

JSONArray

http://192.168.1.101/Web/news.js 内容如下(注意:正规 JSON 键名应加双引号,这里按原文示例):

[
 {
   title : "国家发改委:台湾降油价和大陆没可比性",
   description : "国家发改委副主任朱之鑫",
   image : "http://192.168.1.101/Web/img/a.jpg",
   comment : 163
 },
 {
  title : "国家发改委:台湾降油价和大陆没可比性",
  description : "国家发改委副主任朱之鑫",
  image : "http://192.168.1.101/Web/img/b.jpg",
  comment : 0
 },
 {
   title : "国家发改委:台湾降油价和大陆没可比性",
   description : "国家发改委副主任朱之鑫",
   image : "http://192.168.1.101/Web/img/c.jpg",
   comment : 0
 }
]
String jsonStr = DataUtil.Stream2String(in);
JSONArray array = new JSONArray(jsonStr);

for (int i = 0; i < array.length(); i++) {
   JSONObject obj = array.getJSONObject(i);
   String title = obj.getString("title");
   String description = obj.getString("description");
}

注意:json 数组并非全是由 json 对象组成;每个元素数据类型可以不同。


三、把对象生成 json 字符串

Logs.d("=========生成json数组字符串========================");
JSONObject j1 = new JSONObject();
j1.put("userName", "张三");
j1.put("passWord", "123456");

JSONObject j2 = new JSONObject();
j2.put("userName", "李四");
j2.put("passWord", "abcd");

JSONArray array = new JSONArray();
array.put(0, j1);
array.put(1, j2);
Logs.v(array.toString());

Logs.d("=========解析json数组========================");
for(int i = 0; i<array.length(); i++){
    JSONObject jsonObject = array.getJSONObject(i);
    String userName = jsonObject.getString("userName");
    String passWord = jsonObject.getString("passWord");
    Logs.v("userName :"+userName+", passWord :"+passWord);
}

四、fastjson 生成与解析

Fastjson 是 Java 高性能 JSON 库,parse 很快,支持 json.org 标准,以及基本类型、JavaBean、Collection、Map、Enum、泛型;可跑 JDK 5/6、Android、阿里云手机。常用四种:JavaBean、List<JavaBean>、List<String>、List<Map<String,Object>>。

生成:

String jsonString = JSON.toJSONString(object);

解析:

// 1. JavaBean
Person person = JSON.parseObject(jsonString, Person.class);

// 2. List<JavaBean>
List<Person> listPerson = JSON.parseArray(jsonString, Person.class);

// 3. List<String>
List<String> listString = JSON.parseArray(jsonString, String.class);

// 4. List<Map<String,Object>>

参考: JSON官网、FastJson


五、Object References

下面这份 JSON 里有两位作者、两本书。书通过 id 引用作者,authors 字段只存 id,而不是嵌套整份作者对象。这很常见:用 id 引用重复对象,缩小体积。

{
  'authors': [
    {
      'id': 1,
      'name': 'Joshua Bloch'
    },
    {
      'id': 2,
      'name': 'Neal Gafter'
    }
  ],
  'books': [
    {
      'title': 'Java Puzzlers: Traps, Pitfalls, and Corner Cases',
      'isbn': '032133678X',
      'authors':[1, 2]
    },
    {
      'title': 'Effective Java (2nd Edition)',
      'isbn': '0321356683',
      'authors':[1]
    }
  ]
}
场景 Android 做法
对象 new JSONObject(str) + getString / getJSONObject
数组 new JSONArray(str) 再 for + getJSONObject
生成 put 后 toString()
Bean / List fastjson toJSONString / parseObject / parseArray

一句话总结:JSON 就是 {} 对象和 [] 数组;Android 用 JSONObject / JSONArray 按键取值,Bean 列表更省事时用 fastjson 的 toJSONString / parseObject / parseArray。

转载请注明来源:Json数据解析
本文链接地址:https://ai.zhousir.top/?p=942
回复 取消