我的Json解析实战

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 所谓json,其实就是在我们访问一个网页的接口的时候,服务器端传送给我们客户端的一种数据的结构,当然我们向服务器端发送的数据有时也会转换成json格式,当然了,这不是必须的。最近在解析一些json字符串,所以就贴出一些代码,也方便以后自己复习和使用。

所谓json,其实就是在我们访问一个网页的接口的时候,服务器端传送给我们客户端的一种数据的结构,当然我们向服务器端发送的数据有时也会转换成json格式,当然了,这不是必须的。最近在解析一些json字符串,所以就贴出一些代码,也方便以后自己复习和使用。
首先先来一些简单的吧。
对一个json对象进行解析:
字符串原串是这样的:String json={“Persons”:[{“address”:”河南”,”name”:”郭XX”,”id”:201492115},{“address”:”大连”,”name”:”unName”,”id”:201492111}]},(我这里声明为String是不正确的格式,知识为了看起来方便)很明显可以看出在Persons这个key是对应一个数组的,而数组的内容则是一个对象,对象有三个成员变量address,name,id,每一个也都对应相应的value,下面让我们开始正式的解析吧,
代码如下:

public class TestJson {

    public TestJson() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String []args){
        JsonService jsonService=new JsonService();
//      Person person=(Person) jsonService.getPerson();
        try {
            String message=JsonTools.createJsonObject("Persons", jsonService.getListString());
            System.out.println(message);
            JSONObject jsonObject=new JSONObject(message);
            JSONArray jsonArray=jsonObject.getJSONArray("Persons");
            for(int i=0;i<jsonArray.length();i++){
                Person p=new Person();
                int id;
                String name="";
                String address="";
                address=jsonArray.getJSONObject(i).getString("address");
                name=jsonArray.getJSONObject(i).getString("name");
                id=Integer.parseInt(jsonArray.getJSONObject(i).getString("id"));
                p.setAddress(address);
                p.setId(id);
                p.setName(name);
                System.out.println("Person:"+p.toString());
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

下面是解析的结果:

Person:Person [id=201492115, name=郭XX, address=河南]
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℃”}]}]}
是很复杂吧,反正一开始看,就觉得这什么啊,简直太乱了,但是我们仔细的查看一下,发现这个还是有很清晰的结构的,无非数组里面有潜逃了几层对象嘛,话不多说,直接上代码吧。

package com.tiger;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

public class TestSSDut {

    public TestSSDut() {
        // TODO Auto-generated constructor stub
    }
    public static String loadJson (String url) {  
        StringBuilder json = new StringBuilder();  
        try {  
            URL urlObject = new URL(url);  
            URLConnection uc = urlObject.openConnection();  
            BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(),"utf-8"));  
            String inputLine = null;
            while ( (inputLine = in.readLine()) != null) {  
                json.append(inputLine);  
            }  
            in.close();  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return json.toString();  
    }

    public static String JsonComplier(String jsonString) throws JSONException{



        return null;
    }

    public static void main(String []args){
        String json=loadJson("http://api.map.baidu.com/telematics/v3/weather?location=%E6%88%90%E9%83%BD&output=json&ak=rnm8udmHdWaHFWZTO2tuTiG8");
        System.out.println(json);
        String result;
        try {
            String str="";
            JSONTokener jsonParser = new JSONTokener(json);    
            // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。    
            // 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String)    
            JSONObject person = (JSONObject) jsonParser.nextValue();    
            // 接下来的就是JSON对象的操作了    
            String error=person.getString("error");    
            String status=person.getString("status");
            String date=person.getString("date");
            str+="error="+error+"  status="+status+"  date="+date;
            System.out.println(str);
            JSONArray jsonArray=person.getJSONArray("results");
            for(int i=0;i<jsonArray.length();i++){
                String currentCity=jsonArray.getJSONObject(i).getString("currentCity");
                System.out.println("currentCity="+currentCity);
                String pm2_5=jsonArray.getJSONObject(i).getString("pm25");
                System.out.println("pm2_5="+pm2_5);
                JSONArray index=jsonArray.getJSONObject(i).getJSONArray("index");
                for(int j=0;j<index.length();j++){
                    String title=index.getJSONObject(i).getString("title");
                    System.out.println(title);
                    String zs=index.getJSONObject(i).getString("zs");
                    System.out.println(zs);
                    String tipt=index.getJSONObject(i).getString("tipt");
                    System.out.println(tipt);
                    String des=index.getJSONObject(i).getString("des");
                    System.out.println(des);
                }

                JSONArray weather_data=jsonArray.getJSONObject(i).getJSONArray("weather_data");
                for(int j=0;j<weather_data.length();j++){
                    String datee=weather_data.getJSONObject(i).getString("date");
                    System.out.println(datee);
                    String dayPictureUrl=weather_data.getJSONObject(i).getString("dayPictureUrl");
                    System.out.println(dayPictureUrl);
                    String nightPictureUrl=weather_data.getJSONObject(i).getString("nightPictureUrl");
                    System.out.println(nightPictureUrl);
                    String weather=weather_data.getJSONObject(i).getString("weather");
                    System.out.println(weather);
                    String wind=weather_data.getJSONObject(i).getString("wind");
                    System.out.println(wind);
                    String temperature=weather_data.getJSONObject(i).getString("temperature");
                    System.out.println(temperature);
                }
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public static List<String> getJsonArrayValue(String jsonString) throws JSONException{
        JSONObject demoJson = new JSONObject();
        JSONArray numberList = demoJson.getJSONArray(jsonString);
        List<String>list=new ArrayList<String>();
        for(int i=0; i<numberList.length(); i++){
              //获取数组中的数组
              list.add(String.valueOf(numberList.getJSONArray(i).getInt(0)));
        }
        return list;

    }
}

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

error=0  status=success  date=2015-10-16
currentCity=成都
pm2_5=173
穿衣
舒适
穿衣指数
建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。
周五 1016日 (实时:26℃)
http://api.map.baidu.com/images/weather/day/duoyun.png
http://api.map.baidu.com/images/weather/night/xiaoyu.png
多云转小雨
南风微风
25 ~ 18℃
周五 1016日 (实时:26℃)
http://api.map.baidu.com/images/weather/day/duoyun.png
http://api.map.baidu.com/images/weather/night/xiaoyu.png
多云转小雨
南风微风
25 ~ 18℃
周五 1016日 (实时:26℃)
http://api.map.baidu.com/images/weather/day/duoyun.png
http://api.map.baidu.com/images/weather/night/xiaoyu.png
多云转小雨
南风微风
25 ~ 18℃
周五 1016日 (实时:26℃)
http://api.map.baidu.com/images/weather/day/duoyun.png
http://api.map.baidu.com/images/weather/night/xiaoyu.png
多云转小雨
南风微风
25 ~ 18

解析出来的数据不是很全面。但我们还是来看一下这个思想吧。
我们一开始声明了一个JSONObject 名为person,这就是那个json字符串的最外边一层的key,接下来的操作需要依靠它来进行。对于解析过程,我们的思想就是:
1、对于直接的key我们可以直接获得对应的值,
2、对于对象,我们就需要借助JSONArray,来进行单独的处理,以获得所有的键值。
3、还有最重要的是,根据person获得的JsonObject 只能使用一次,对于对象里面的对象我们就需要使用该数组来再次获得一个数组,再对新的数组进行键值的处理即可。
好了,差不多就是这样了。本人能力有限,还望博友们多多提携,让我们一起进步吧。

目录
相关文章
|
24天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
72 13
|
20天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
199 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
19天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
130 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
4天前
|
数据采集 XML API
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧
|
11天前
|
JSON JavaScript 前端开发
一次采集JSON解析错误的修复
两段采集来的JSON格式数据存在格式问题,直接使用PHP的`json_decode`会报错。解决思路包括:1) 手动格式化并逐行排查错误;2) 使用PHP-V8JS扩展在JavaScript环境中解析。具体方案一是通过正则表达式和字符串替换修复格式,方案二是利用V8Js引擎执行JS代码并返回JSON字符串,最终实现正确解析。 简介: 两段采集的JSON数据因掺杂JavaScript代码导致PHP解析失败。解决方案包括手动格式化修复和使用PHP-V8JS扩展在JavaScript环境中解析,确保JSON数据能被正确处理。
|
15天前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
1月前
|
数据采集 DataWorks 搜索推荐
阿里云DataWorks深度评测:实战视角下的全方位解析
在数字化转型的大潮中,高效的数据处理与分析成为企业竞争的关键。本文深入评测阿里云DataWorks,从用户画像分析最佳实践、产品体验、与竞品对比及Data Studio公测体验等多角度,全面解析其功能优势与优化空间,为企业提供宝贵参考。
112 13
|
29天前
|
数据采集 存储 JavaScript
网页爬虫技术全解析:从基础到实战
在信息爆炸的时代,网页爬虫作为数据采集的重要工具,已成为数据科学家、研究人员和开发者不可或缺的技术。本文全面解析网页爬虫的基础概念、工作原理、技术栈与工具,以及实战案例,探讨其合法性与道德问题,分享爬虫设计与实现的详细步骤,介绍优化与维护的方法,应对反爬虫机制、动态内容加载等挑战,旨在帮助读者深入理解并合理运用网页爬虫技术。
|
1月前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
2月前
|
自然语言处理 编译器 Linux

推荐镜像

更多