Gson解析JSON

该博客介绍了如何使用Gson库解析包含动态键的JSON数据,特别是针对那些键名会随日期变化的部分。通过实例展示了如何创建实体类并利用Gson将JSON数据映射到Map对象,从而方便地获取动态键对应的FutureDay实体。同时,对比了遍历Map的keySet()和entrySet()两种方法在效率上的差异。
摘要由CSDN通过智能技术生成

Gson解析JSON(包含动态KEY、未知字段处理方法)

有时在解析json数据中的字段key是动态可变的时候,由于Gson是使用静态注解的方式来设置实体对象的,因此我们很难直接对返回的类型来判断。但Gson在解析过程中如果不知道解析的字段,就会将所有变量存储在一个Map中,我们只要实例化这个map就能动态地取出key和value了。

先给出一段jsondata,这是天气预报的数据,其中 day_20151011 这种key是随日期而变化的,在实体类中就不能当做静态变量来处理,我们就通过map来取出其映射对象。

{
    "resultcode": "200",
    "reason": "successed!",
    "result": {
        "sk": {
            "temp": "24",
            "wind_direction": "东北风",
            "wind_strength": "2级",
            "humidity": "28%",
            "time": "17:38"
        },
        "today": {
            "temperature": "15℃~26℃",
            "weather": "多云转晴",
            "wind": "东北风微风",
            "week": "星期日",
            "city": "桂林",
            "date_y": "2015年10月11日",
            "dressing_index": "舒适",
            "dressing_advice": "建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。",
            "uv_index": "弱",
            "comfort_index": "",
            "wash_index": "较适宜",
            "travel_index": "较适宜",
            "exercise_index": "较适宜",
            "drying_index": ""
        },
        "future": {
            "day_20151011": {
                "temperature": "15℃~26℃",
                "weather": "多云转晴",
                "wind": "东北风微风",
                "week": "星期日",
                "date": "20151011"
            },
            "day_20151012": {
                "temperature": "16℃~27℃",
                "weather": "晴转多云",
                "wind": "微风",
                "week": "星期一",
                "date": "20151012"
            },
            "day_20151013": {
                "temperature": "16℃~26℃",
                "weather": "多云转晴",
                "wind": "微风",
                "week": "星期二",
                "date": "20151013"
            },
            "day_20151014": {
                "temperature": "17℃~27℃",
                "weather": "晴",
                "wind": "北风微风",
                "week": "星期三",
                "date": "20151014"
            },
            "day_20151015": {
                "temperature": "17℃~28℃",
                "weather": "晴",
                "wind": "北风微风",
                "week": "星期四",
                "date": "20151015"
            },
            "day_20151016": {
                "temperature": "17℃~30℃",
                "weather": "晴",
                "wind": "北风微风",
                "week": "星期五",
                "date": "20151016"
            },
            "day_20151017": {
                "temperature": "17℃~30℃",
                "weather": "晴",
                "wind": "北风微风",
                "week": "星期六",
                "date": "20151017"
            }
        }
    },
    "error_code": 0
}

相关的实体类如下:

public class FutureDay {
    private String temperature;
    private String weather;
    private String wind;
    private String week;
    private String date;
}
public class Result {
    private Sk sk;
    private Today today;
    private Map<String,FutureDay> future;
}
public class Sk {
    private String temp;
    private String wind_direction;
    private String wind_strength;
    private String humidity;
    private String time;
}
public class Today {
    private String temperature;
    private String weather;
    private String week;
    private String city;
    private String date_y;
    private String dressing_index;
    private String dressing_advice;
    private String uv_index;
    private String comfort_index;
    private String wash_index;
    private String travel_index;
    private String exercise_index;
    private String drying_index;
}
public class Response {
    private String resultcode;
    private String reason;
    private String error_code;
    private Result result;
}

具体解析过程如下代码所示:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Map;
import weather.*;
import com.google.gson.Gson;


public class GsonParseDynamicKey {
    public static  void main( String args []){
        String jsondata = readJsonFile();//从文件中读取出json字符串,并打印出来
        Gson gson = new Gson();
        System.out.println("Start Gson parse jsondata");   
        Response response = gson.fromJson(jsondata, Response.class);        
        System.out.println(response.toString());
        System.out.println(response.getResult().getSk().toString());
        System.out.println(response.getResult().getToday().toString());

        // 对动态的key,来创建map,间接从中取出实体类futrue。
        Map<String, FutureDay> future = response.getResult().getFuture(); 
        // 这里取出value的方法有两种keySet() entrySet().都给出了遍历的方法
        System.out.println("Keyset method");                     
        // 遍历取出key,再遍历map取出value。
        for (String key:future.keySet()){                        
            System.out.println("key:"+key); 
            System.out.println(future.get(key).toString());
        }

        System.out.println("Entryset method");
        // 遍历取出键值对,调用getkey(),getvalue()取出key和value。
        for (Map.Entry<String,FutureDay> pair:future.entrySet()) {
             System.out.println("key:"+pair.getKey());
             System.out.println(pair.getValue().toString());
       }    
}

这里顺便一提遍历Map的两种方法keySet(),entrySet()的差别。
keySet()方法返回的是key的集合set,entrySet()返回的是键值对的集合set。虽然两者从set遍历取出元素的方法是一样的,但是根据这个元素取出value的效率有些不同。前者取出的元素是key,还要去原map中遍历取出value。
后者取出的元素是键值对,直接调用getkey(),getvalue()方法就能快速取出key和value。显然在map中存在大量键值对时,使用entrySet()来取出value的效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CyberOptimus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值