json数组的解析

一直以来,经常会遇到json数据从前端或者我经常从网站上爬取的数据中会有json数据的存在,这样如果想要获取json数据就需要对json数据进行解析

 

在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好,下面先看下JSON的格式,

JSON可以有两种格式,一种是对象格式的,另一种是数组对象,

{"name":"JSON","address":"北京市西城区","age":25}//JSON的对象格式的字符串

[{"name":"JSON","address":"北京市西城区","age":25}]//数据对象格式

从上面的两种格式可以看出对象格式和数组对象格式唯一的不同则是在对象格式的基础上加上了[],再来看具体的结构,可以看出都是以键值对的形式出现的,中间以英文状态下的逗号(,)分隔。

在前端和后端进行数据传输的时候这种格式也是很受欢迎的,后端返回json格式的字符串,前台使用js中的JSON.parse()方法把JSON字符串解析为json对象,然后进行遍历,供前端使用。

下面我用的是java语言解析json数据的

解析数据前需要引入一个包

 

可以到http://mvnrepository.com/artifact/edu.uci.ics这里下载相应的jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class JsonToObject {
    /**解析json字符串最外面是[]的情况
     * [{"rating":["9.6","50"],"rank":1},{"rating":["9.6","50"],"rank":2}]
     * @throws Exception
     */
    public List<Map<String, String>> toMapOne(String jsonString)throws Exception{
        //第一步是将最外面一层的数组解析去掉,得到所有的json串
        JSONArray jsons = JSONArray.fromObject(jsonString);
         
        List<Map<String, String>>  nodes = new ArrayList<Map<String, String>>();
        //循环遍历所有的json子串
        for (Object o : jsons)
        {
            JSONObject jsonNode = JSONObject.fromObject(o);
            Map<String, String> treeNodes = new HashMap<String, String>();
            String rating = "";
            JSONArray ratingArray = JSONArray.fromObject(jsonNode.getString("rating").trim());
            for(Object ob : ratingArray) {
                rating += ob.toString()+",";
            }
            treeNodes.put("rating",rating);
            treeNodes.put("rank",jsonNode.getString("rank").trim());
            nodes.add(treeNodes);
        }
        return nodes;
    }
     
    /**解析json字符串最外面是{}的情况
     * {"data":[{"directors":["普特鹏·普罗萨卡·那·萨克那卡林","华森·波克彭"],"rate":"8.3"},{"directors":["大卫·芬奇"],"rate":"8.7"}]}
     * @throws Exception
     */
    public List<Map<String, String>> toMapTwo(String jsonString)throws Exception{
        //首先将jsonString字符串转化为jsonObject
        JSONObject jsonNode = JSONObject.fromObject(jsonString);
        //然后获取json中data的值
        JSONArray jsonArray = JSONArray.fromObject(jsonNode.getString("data"));
        List<Map<String, String>>  nodes = new ArrayList<Map<String, String>>();
        //遍历data里边的值
        for (Object object : jsonArray) {
            JSONObject jsonNode2 = JSONObject.fromObject(object);
            Map<String, String> treeNodes = new HashMap<String, String>();
            treeNodes.put("directors",jsonNode2.getString("directors"));
            treeNodes.put("rate",jsonNode2.getString("rate").trim());
            nodes.add(treeNodes);
        }
        return nodes;
    }
    public static void main(String[] args) throws Exception {
        String jsonString = "[{\"rating\":[\"9.6\",\"50\"],\"rank\":1},{\"rating\":[\"9.6\",\"50\"],\"rank\":2}]";
        String jsonString2 = "{\"data\":[{\"directors\":[\"普特鹏·普罗萨卡·那·萨克那卡林\",\"华森·波克彭\"],\"rate\":\"8.3\"},{\"directors\":[\"大卫·芬奇\"],\"rate\":\"8.7\"}]}";
        JsonToObject jo = new JsonToObject();
        List<Map<String, String>> listMap = jo.toMapOne(jsonString);
        List<Map<String, String>> listMap2 = jo.toMapTwo(jsonString2);
        //上面获取到了json的数据并且封装到list集合中去,并且list
        //里面封装的是map集合
        for (Map<String, String> map : listMap) {
            String rating = map.get("rating");
            String rank  = map.get("rank");
            System.out.println("rating: "+rating);
            System.out.println("rank: "+rank);
        }
        for (Map<String, String> map : listMap2) {
            String directors = map.get("directors");
            String rate = map.get("rate");
            System.out.println("directors: "+directors);
            System.out.println("rate: "+rate);
        }
 
    }
}

  运行的结果:

对于toMapOne里的函数调试的变量值情况:

 

 

 

posted @   四季写爱  阅读(9082)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示