解析JSON
什么是JSON?
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式
,易于人阅读和编写,同时也易于机器解析和生成,而且它是基于JavaScript的
。
JSON 文件的文件类型是 .json
,JSON 文本的 MIME 类型是 application/json
JSON的基本形式
{} 双括号表示对象
:对象是一个无序的 “名/值” 对的集合(A collection of name/value pairs),一个对象以 “{” 开始,“}” 结束,每个名称后跟一个":",“名/值”对之间使用“,” 分隔。
[] 中括号表示数组
:值的有序列表(An ordered list of values),一个数组以“[”开始,“]”结束,值之间使用“,”分隔。
"" 双引号内是属性或值
,值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
实例
-- 对象
{"name":"小明","age":"18"}
-- 数组
[{"name":"小明","age":"18"},{"name":"小红","age":"19"}]
-- 嵌套
{"code":"200","msg":"成功","data":{"msg":"ssssss","name":"xxxxxx"}}
{
"value":"200",
"data":{"msg":"ssssss","name":"xxxxxx"},
"result":[
{"name":"小明","age":"18"},
{"name":"小红","age":"19"} ]
}
如果需要生成模拟数据,将数据复制到文本编辑器中,采用全部替换,将"替换为\"
,这样便可以直接使用。
前端解析JSON
JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的 API 或工具包。
<script>
// 将JSON数据赋值给变量
var str =
{ "user": [
{ "name":"小明", "age":"18" },
{ "name":"小红", "age":"19" }
] };
// 获取第一条记录的name信息
str.user[0].name;
// 修改数据
str.user[0].name = "小李";
</script>
客户端处理JSON响应
服务器端返回JSON相应的文本表示,如:
{ "name":"小明", "age":"18" }
客户端使用 eval()函数 将JSON文本转化为JavaScript对象:
<script>
// 使用额外的圆括号可使eval()函数将来源输入无条件地视为表达式进行解析
var resultTmp = eval('(' + request.responseText + ')');
// 两种方式取得相应的值
resultTmp.name;
resultTmp[''+ "name" +''];
// ajax同理
$.ajax({
type : "GET",
url : "xxxx?k1=v1",
async : false,
success : function(data) {
var result = eval('(' + data + ')');
if (null != result && result != ""){
var info = result['' + "info" + ''];
}
}
});
</script>
Java解析JSON
fastjson方式
使用 fastjson-x.x.xx.jar,对于方法中根据key获取value时,要注意判断null
。
方法 | 返回值 | 含义 |
---|---|---|
JSON.parseObject(Strign str) | JSONObject对象 | 将json字符串转换为对象 |
JSONObject对象.getString(“xxx”) | 返回value值 | 获取对象中的值 如果没有指定的key,则返回null |
JSONObject对象.getJSONArray(“xxx”) | 返回一个JSONArray数组,包含多个JSON对象 | 获取array,需要循环获取数据 不存在则返回null |
import java.util.Map;
// fastjson-1.2.51.jar
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class AnalysisFirst {
/* 第一种:最简易的格式
{
"key":"小红",
"value":"18"
}
*/
public static void format1() {
String jsonStr = "{\"key\":\"小红\",\"value\":\"18\"}";
JSONObject jsonObject = JSON.parseObject(jsonStr);
String key = jsonObject.getString("key");
String value = jsonObject.getString("value");
System.out.println(jsonStr); // {"key":"小红","value":"18"}
System.out.println(key + " " + value); // 小红 18
}
/* 第二种:属性值为json,递归操作即可
{
"code":"200",
"msg":"成功",
"data":{"msg":"ssssss","name":"xxxxxx"},
"des":{"id":"1","info":"信息"}
}
*/
public static void format2() {
String jsonStr = "{\"code\":\"200\",\"msg\":\"成功\",\"data\":{\"msg\":\"ssssss\",\"name\":\"xxxxxx\"},\"des\":{\"id\":\"1\",\"info\":\"信息\"}}";
System.out.println(jsonStr); // {"code":"200","msg":"成功","data":{"msg":"ssssss","name":"xxxxxx"},"des":{"id":"1","info":"信息"}}
JSONObject jsonObject = JSON.parseObject(jsonStr);
System.out.println(jsonObject.getString("code")); // 200
System.out.println(jsonObject.getString("msg")); // 成功
JSONObject dataObject = JSON.parseObject(jsonObject.getString("data"));
System.out.println(dataObject.getString("msg")); // ssssss
// 在获取时需要先判断是否为null,避免出现异常
System.out.println(dataObject.getString("msg1") == null); // true
System.out.println(JSON.parseObject(jsonObject.getString("des")).getString("info"));
}
/* 第三种:属性值为array
{
"value":"200",
"des":{"id":"1","info":"信息"},
"result":
[
{"name":"小明","age":"18"},
{"name":"小红","age":"19"}
]
}
*/
public static void format3() {
String jsonStr = "{\"value\":\"200\",\"data\":{\"msg\":\"ssssss\",\"name\":\"xxxxxx\"},\"result\":[{\"name\":\"小明\",\"age\":\"18\"},{\"name\":\"小红\",\"age\":\"19\"}]}";
System.out.println(jsonStr);
JSONObject jsonObject = JSON.parseObject(jsonStr);
for (Object info : jsonObject.getJSONArray("result")) {
// 一条具体的json数据
JSONObject object = (JSONObject)info;
if(object.get("name") != null){
System.out.println(object.get("name").toString());
System.out.println(object.getString("name"));
}
}
}
/* 第四种:直接是array,如果每一个里面又是嵌套,依次解析
[
{"name": "小明","age": "18"},
{"name": "小红","age": "19"}
]
*/
public static void format4() {
String jsonStr = "[{\"name\":\"小明\",\"age\":\"18\"},{\"name\":\"小红\",\"age\":\"19\"}]";
System.out.println(jsonStr);
// 方式一:直接作为JSONArray -> map
JSONArray jsonArray = JSONArray.parseArray(jsonStr);
if(null != jsonArray && !jsonArray.isEmpty()) {
for(int i=0; i<jsonArray.size(); i++) {
Map map = (Map)jsonArray.get(i);
System.out.println(map.get("name"));
}
}
// 方式二
for (Object info : JSONArray.parseArray(jsonStr)) {
// 一条具体的json数据
JSONObject object = (JSONObject)info;
if(object.get("age") != null){
System.out.println(object.getString("age"));
}
}
}
// 将json解析为JavaBean对象
public static void toJavaBean() {
String str = "{\"name\":\"小明\",\"age\":\"18\"}";
System.out.println(str);
Student student = new Student();
try {
student = JSON.parseObject(str, Student.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(student.toString());
}
}
json-lib方式
使用json-lib-2.4.jar
import java.util.Map;
// json-lib-2.4.jar
import net.sf.json.JSONObject;
public class JsonTool {
public static void main(String[] args) {
String jsonStr = "{\"key\":\"小红\",\"value\":\"18\"}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
String key = jsonObject.getString("key");
String value = jsonObject.getString("value");
System.out.println(jsonObject);// {"key":"小红","value":"18"}
System.out.println(key + " " + value);// 小红 18
// 将 Json转换为 Map
Map<String, Object> jsonToMap = (Map<String, Object>) JSONObject.toBean(jsonObject, Map.class);
System.out.println("将 Json转换为 Map:"+jsonToMap);// 将Json转换为 Map:{value=18, key=小红}
// 将 Json转换为 JavaBean
jsonStr = "{\"name\":\"小李\",\"age\":\"18\"}";
JSONObject jsonObject1 = JSONObject.fromObject(jsonStr);
Student jsonToBean = (Student) JSONObject.toBean(jsonObject1, Student.class);
System.out.println(jsonToBean.getName()+jsonToBean.getAge());// 小李18
}
}
android-json方式
最原始的解析方式,了解即可。
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.alibaba.fastjson.JSON;
public class AnalysisSecond {
/*
* 第一种:最简易的格式 { "key":"小红", "value":"18" }
*/
public static void format1() {
String jsonStr = "{\"key\":\"小红\",\"value\":\"18\"}";
JSONObject jsonObject;
try {
jsonObject = new JSONObject(jsonStr);
String key = jsonObject.getString("key");
String value = jsonObject.getString("value");
System.out.println(jsonStr); // {"key":"小红","value":"18"}
System.out.println(key + " " + value); // 小红 18
} catch (JSONException e) {
e.printStackTrace();
}
}
/* 第二种:属性值为json,递归操作即可
{
"code":"200",
"msg":"成功",
"data":{"msg":"ssssss","name":"xxxxxx"},
"des":{"id":"1","info":"信息"}
}
*/
public static void format2() {
String jsonStr = "{\"code\":\"200\",\"msg\":\"成功\",\"data\":{\"msg\":\"ssssss\",\"name\":\"xxxxxx\"},\"des\":{\"id\":\"1\",\"info\":\"信息\"}}";
System.out.println(jsonStr); // {"code":"200","msg":"成功","data":{"msg":"ssssss","name":"xxxxxx"},"des":{"id":"1","info":"信息"}}
JSONObject jsonObject;
try {
jsonObject = new JSONObject(jsonStr);
System.out.println(jsonObject.getString("code")); // 200
System.out.println(jsonObject.getString("msg")); // 成功
JSONObject dataObject = new JSONObject(jsonObject.getString("data"));
System.out.println(dataObject.getString("msg")); // ssssss
// 在获取时需要先判断是否为null,避免出现异常
System.out.println(dataObject.getString("msg1") == null); // true
System.out.println(JSON.parseObject(jsonObject.getString("des")).getString("info"));
} catch (JSONException e) {
e.printStackTrace();
}
}
/*
* 第三种:属性值为array { "value":"200", "des":{"id":"1","info":"信息"}, "result": [
* {"name":"小明","age":"18"}, {"name":"小红","age":"19"} ] }
*/
public static void format3() {
String jsonStr = "{\"value\":\"200\",\"data\":{\"msg\":\"ssssss\",\"name\":\"xxxxxx\"},\"result\":[{\"name\":\"小明\",\"age\":\"18\"},{\"name\":\"小红\",\"age\":\"19\"}]}";
System.out.println(jsonStr);
JSONObject jsonObject;
try {
jsonObject = new JSONObject(jsonStr);
// 返回json的数组
JSONArray jsonArray = jsonObject.getJSONArray("result");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
if (object.get("name") != null) {
System.out.println(object.get("name").toString());
System.out.println(object.getString("name"));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Map,Bean -> JSON
fastjson
使用 fastjson-x.x.xx.jar
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
public class ToJson {
public static void main(String[] args) {
// 将Map解析成JSON
Map<String, Object> map = new HashMap<String, Object>();
map.put("1", "add");
map.put("2", "del");
map.put("3", 520);
JSONObject jsonMap = new JSONObject(map);
System.out.println("map:\n"+map);
System.out.println("JSON:\n"+jsonMap);
String str = jsonMap.toString();
System.out.println("String:\n" + str);
}
}
json-lib
使用 json-lib-2.4.jar
import java.util.HashMap;
import java.util.Map;
// json-lib-2.4.jar
import net.sf.json.JSONObject;
public class ToJson {
public static void main(String[] args) {
// 将Map解析成JSON
Map<String, Object> map = new HashMap<String, Object>();
map.put("1", "add");
map.put("2", "del");
map.put("3", 520);
JSONObject jsonMap = JSONObject.fromObject(map);
System.out.println("map:"+map);
System.out.println("JSON:"+jsonMap);
// 将Bean解析成JSON
Student student = new Student("小红","18");
JSONObject jsonBean = JSONObject.fromObject(student);
System.out.println(jsonBean);// {"age":"18","name":"小红"}
// 嵌套解析成JSON
Map<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("班级", "1班");
tempMap.put("学生", student);
JSONObject json = JSONObject.fromObject(tempMap);
System.out.println(tempMap);
// {学生=test.constant.json.Student@158c4d4c, 班级=1班}
System.out.println(json);
// {"学生":{"age":18,"name":"小红"},"班级":"1班"}
}
}