zoukankan      html  css  js  c++  java
  • Java入门系列:处理Json格式数据

    本节主要讲解:

    1)json格式数据处理方法

    2)第三方工具包的使用方法

    3)java集合数据类型

    【项目任务】

    编写一个程序,显示未来的天气信息。

    【知识点解析】

    为了方便后面代码的分析,先需要掌握几个相关的知识。

    1.什么是json格式数据

    从结构上看,我们所见到的所有的数据(data)最终都可以分解成三种类型:

    第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。
    第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。
    第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。

    json是一种数据格式规则,给出了一套上述三种结构的数据的描述规则,满足这一规则的数据叫做json数据。

    json规则如下:

    1) 并列的数据之间用逗号(", ")分隔。
    2) 映射用冒号(": ")表示。
    3) 并列数据的集合(数组)用方括号("[]")表示。
    4) 映射的集合(对象)用大括号("{}")表示。

    上面四条规则,就是Json格式的所有内容。

    比如,下面这句话:

    "北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。"

    写成json格式就是这样:

    [
      {"城市":"北京","面积":16800,"人口":1600},
      {"城市":"上海","面积":6400,"人口":1800}
    ]

    如果事先知道数据的结构,上面的写法还可以进一步简化:

    [
      ["北京",16800,1600],
      ["上海",6400,1800]
    ]

    有关json数据的更多介绍,请点击查看

    2.如何使用json格式数据

    在java中,对于json格式的数据,不能直接使用,需要先进行解析。这个解释过程包括将任何java格式的数据转换成json格式数据,或将json格式数据转换成java对象。目前有很多第三方json数据解析工具包,提供了非常方便的各种操作,可以直接使用到我们的程序中,自己不必亲自编写解析json的代码了。这些json解析工具中,json-lib使用比较简单,下面一起看看如何在自己程序中加入json-lib工具包。

    一、介绍

    JSON-lib包主要就是用来解析Json数据,在其官网http://www.json.org/上有详细讲解,有兴趣的可以去研究。

    二、下载jar依赖包

     这里以json-lib-2.3.jar包为例,此包需要依赖其它的工具包才能正常使用,程序中除了导入json-lib-2.3.jar包之外,其它依赖包也要导入进去。所有包如下图:

    这里顺便给出要给下载地址:http://pan.baidu.com/s/1kVIrdEf

    三、将工具包添加到工程中

    首先,将jar 复制到myeclispe 工作空间下的,项目目录下!例如: 我的工程名叫 test, 工作空间在D:MyProjects 所以只要把jar 复制到D:MyProjects est下,然后,在myeclipse的项目“test”上右键 ->build path->config build path,显示librars 选项卡 ,点击add jars(在add 前,最后refresh 刷新下,否则你可能看不到你的项目名),将以上6个包逐个添加进去。添加完成后,项目结构如下:

    添加完成后,在要用到json-lib工具的程序代码头部,将所要用到的类import进去即可。

    下面例子是说明json工具的用法

    package dataCollection;
    import java.util.ArrayList;
    import java.util.List;
    import net.sf.json.JSONArray;
    public class MainClass {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List list = new ArrayList();  
            list.add( "first" );  
            list.add( "second" );  
            JSONArray jsonArray = JSONArray.fromObject( list );  
            System.out.println( jsonArray );  
        }
    
    }

    上述代码将链表list转换成一个JSONArray对象,该对象包含的数据是json格式的数据:["first","second"]。

    JSONArray jsonArray = JSONArray.fromObject( "['json','is','easy']" );  
    System.out.println( jsonArray );  
    // 输出结果["json","is","easy"]  

    上述代码是将一个字符串"['json','is','easy']"转换成一个JSONArray对象,该对象所包含的数据是:["json","is","easy"] 

    package dataCollection;
    import java.util.ArrayList;
    import java.util.List;
    import net.sf.json.JSONObject;
    public class MainClass {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String json = "{bool:true,integer:1,string:"json"}";  
            JSONObject jsonObject = JSONObject.fromObject( json );
            System.out.println(jsonObject);
        }
    
    }

    上述代码是将一个字符串 "{bool:true,integer:1,string:"json"}"转换成一个JSONObject对象,该对象所包含的数据是:{bool:true,integer:1,string:"json"}

    想要了解json-lib包更详细的用法,请点击官网

     【实践训练】

    将未来7天天气信息在控制台打印输出,每天一行。

    package dataCollection;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.SocketTimeoutException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    
    /**
     * 得到未来7天的天气(含今天)
     * 
     * @author ww
     * 
     */
    public class Weather {
    
    
        public Weather(String Cityid) throws IOException, NullPointerException {        
            String Ctiyid;
            URLConnection connectionData;
            StringBuilder sb;
            BufferedReader br;// 读取data数据流
            JSONObject jsonData;
            JSONObject info;
                
            // 连接中央气象台的API
            URL url = new URL("http://api.k780.com:88/?app=weather.future&weaid=" + Cityid + "&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json");
            connectionData = url.openConnection();
            connectionData.setConnectTimeout(1000);
            
            sb = new StringBuilder();
            try {
                br = new BufferedReader(new InputStreamReader(
                        connectionData.getInputStream(), "UTF-8"));
                
                String line = null;
                while ((line = br.readLine()) != null){
                    sb.append(line);
                }
            } catch (SocketTimeoutException e) {
                System.out.println("连接超时");
            } catch (FileNotFoundException e) {
                System.out.println("加载文件出错");
            }
            String datas = sb.toString();        
    
            //解析json数据
            jsonData = JSONObject.fromObject(datas);
    
            //info = jsonData.getJSONObject("result");
            JSONArray ja = jsonData.getJSONArray("result");
            // 得到1到6天的天气情况
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            for(int i = 0;i < ja.size();i++){
                Map<String,Object> map = new HashMap<String,Object>();
                JSONObject jobj = ja.getJSONObject(i);
                map.put("days", jobj.getString("days"));
                map.put("week", jobj.getString("days"));
                map.put("citynm", jobj.getString("citynm"));
                map.put("temperature", jobj.getString("temperature"));
                map.put("weather", jobj.getString("weather"));
                map.put("wind", jobj.getString("wind"));
                list.add(map);
            }
    //
            // 控制台打印出天气
            for (int j = 0; j < list.size(); j++) {
                Map<String, Object> wMap = list.get(j);
                System.out.println(wMap.get("citynm") + "	" + wMap.get("days")
                        + "	" + wMap.get("week") + "	" + wMap.get("weather")
                        + "	" + wMap.get("temperature") + "	" + wMap.get("wind"));
            }
    
        }
    
    
        public static void main(String[] args) {
            try {
                new Weather("101010100"); // 101010100(北京)就是你的城市代码
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    ThinkPHP运算符 与 SQL运算符 对比表
    [Java 8] (6) Lambda与资源管理
    Codeforces Round #275 (Div. 2) C
    HOJ 2245 浮游三角胞(数学啊 )
    [UVALive 6663 Count the Regions] (dfs + 离散化)
    浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer
    SpringMVC: web.xml中声明DispatcherServlet时一定要加入load-on-startup标签
    Unity3d 4.3.4f1执行项目
    更新Windows ActiveX,Ios
    C++11: final与override
  • 原文地址:https://www.cnblogs.com/bayes/p/5526779.html
Copyright © 2011-2022 走看看