java解析未知key json_Gson解析JSON中動態未知字段key的方法

前面一篇文章我介紹了Gson的解析的基本方法。但我們在享受Gson解析的高度封裝帶來的便利時,有時可能會遇到一些特殊情況,比如json數據中的字段key是動態可變的時候,由于Gson是使用靜態注解的方式來設置實體對象的,因此我們很難直接對返回的類型來判斷。但Gson在解析過程中如果不知道解析的字段,就會將所有變量存儲在一個Map中,我們只要實例化這個map就能動態地取出key和value了。

先給出一段jsondata,這是天氣預報的數據,其中day_20151002這種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

}

實體類中放上set、get和toString方法就太長了,這里就沒有加上去。

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?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());

Map?future?=?response.getResult().getFuture();?//對動態的key,來創建map,間接從中取出實體類futrue。

System.out.println("Keyset?method");?????????????????????//這里取出value的方法有兩種keySet()?entrySet().都給出了遍歷的方法

for?(String?key:future.keySet()){????????????????????????//遍歷取出key,再遍歷map取出value。

System.out.println("key:"+key);

System.out.println(future.get(key).toString());

}

System.out.println("Entryset?method");

for?(Map.Entry?pair:future.entrySet()){//遍歷取出鍵值對,調用getkey(),getvalue()取出key和value。

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的效率更高。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457199.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457199.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Twisted入門教程(5)

2019獨角獸企業重金招聘Python工程師標準>>> 第五部分:由Twited支持的詩歌下載服務客戶端 你可以從這里從頭開始閱讀這個系列 抽象地構建客戶端 在第四部分中,我們構建了第一個使用Twisted的客戶端。它確實能很好地工作,但仍有提高…

Jquery 學習之基礎一

1.添加一個CSS類 $("button").click(function(){ $("#div1").addClass("important blue");}); 2.移除一個類 $("button").click(function(){ $("h1,h2,p").removeClass("blue");}); 3.切換類 $("button&…

**print('人生苦短 我愛Python')**

print(‘人生苦短 我愛Python’) 一、變量 **""" 1.代碼自上而下執行 2_運算符和表達式.一行一句,不要把多個語句寫到一行上,可讀性不好 3中文只能出現在引號里,其他地方不能出現中文 4不能隨意縮進 """**pr…

java線程提高速度_如何在JAVA中減慢線程速度

我有這個類,我在其中運行10次for循環.該類實現了Runnable接口.現在在main()中我創建了2個線程.現在兩個都將循環運行到10.但我想檢查每個線程的循環計數.如果t1超過7,則讓它休眠1秒,以便讓t2完成.但是如何實現這一目標呢?請參閱代碼.我嘗試但看起來完全愚蠢.只是如何…

(轉ORCLE導入導出命令)

oracle數據庫導入導出命令!Oracle數據導入導出imp/exp 功能:Oracle數據導入導出imp/exp就相當與oracle數據還原與備份。 大多情況都可以用Oracle數據導入導出完成數據的備份和還原(不會造成數據的丟失)。 Oracle有個好處&…

筆記本(華碩UL80VT)軟件超頻setFSB

Warning !!!If you are a beginner, do not use this software. This software is for power users only. Use "SetFSB.exe" at your own risk.試了setfsb各種版本,基本不能打開。還有官網的免費版,居然不能用,真是很奇怪。 官網&a…

Day01-python編程基礎

1. 程序 為了完成某種特定功能,以某種程序設計語言編寫的有序指令的集合。程序是指揮cpu工作的“工作手冊”。計算機只能執行二進制代碼,程序設計語言一般類似英文,想要讓計算機理解你寫的程序,必須把程序代碼“翻譯”成計算機能…

pro c 訪問 MySQL_Pro*C??OCI??OCCI??及OCI介紹

Pro*C OCIOCCI 這三種都是C/C訪問數據庫的手段。Pro*C:內嵌SQL,預編譯后把內嵌SQL處理為ORACLE標準運行庫的調用,然后再象編譯一般的C程序一樣進行編譯、連接、運行。1.proc XXX.pc2.gcc/g XXX.c –lclntsh(PRO*C的預編譯,也可直接MAKEFILE…

細說Cookie

http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html轉載于:https://www.cnblogs.com/benpaodexiaopangzi/p/5933230.html

Node.js~在linux上的部署

我們以centOS為例來說說如何部署node.js環境 一 打開centos,然后開始下載node.js包 curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - yum -y install nodejs 二 安裝gcc環境 yum install gcc-c make 安裝完成! 三 安裝nodejs的npm,這是一個包程序工具…

Django中的class Meta知識點

今天來回顧一下Django中model的class Meta class Main(models.Model):img models.CharField(max_length200) # 圖片name models.CharField(max_length100) # 名稱trackid models.CharField(max_length16) # 通用idclass Meta:abstract True #抽象類class MainWheel(…

python wheel使用_Python wheel.Wheel方法代碼示例

# 需要導入模塊: from pip import wheel [as 別名]# 或者: from pip.wheel import Wheel [as 別名]def from_line(cls, name, comes_fromNone, prereleasesNone):"""Creates an InstallRequirement from a name, which might be arequirement, directory contai…

英語學習Day1

今天要開始學英語了,我這個人沒什么長性,語言這種東西對我來說又是很不擅長的一種技能,那為什么要學英語呢?我要做翻譯,也是呵呵了,主要是我想賺錢,這個力量能夠支撐我吧,我想。 網上…

LeetCode題解-3-Longest Substring Without Repeating Characters

2019獨角獸企業重金招聘Python工程師標準>>> 解題思路 首先要讀懂題目,它要求的是找到最長的子串,并且子串中沒有出現重復的字符。 我的想法,是用一個map存儲每個字符最后出現的位置,還要有個變量start,它用…

Day02-變量_數據類型和運算符

1 數據類型 不同類型的變量可以進行的運算是不同的,所以必須理解變量的類型,python中數據類型可以分為: 內置類型 數值類型:整型int,浮點型float,復數(complex) 35j str:字符串 b…

css hack

http://blog.csdn.net/swallowliyan/article/details/50803469轉載于:https://www.cnblogs.com/annie211/p/5934035.html

java從哪學到哪_Java JVM怎么學習啊?從哪方面入手?

叮當貓咪一、 JVM的生命周期  1. JVM實例對應了一個獨立運行的java程序它是進程級別  a) 啟動。啟動一個Java程序時,一個JVM實例就產生了,任何一個擁有public static void main(String[] args)函數的class都可以作為JVM實例運行的起點  b) 運行。m…

JMeter處理Cookie與Session

cookie 和session 的區別: 1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。 2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙 考慮到安全應當使用session。 3、session會在一定時間內保存在服務器上。當…

Maximum sum(poj 2479)

題意:給一段數列,將這個數列分成兩部分,使兩部分的最大子段和的和最大,輸出和/*看數據沒想到是(O)n的算法,求出從前向后的最大子段和和從后向前的最大子段和,然后枚舉斷點。 第一次提交不小心折在數組最小值…

java futuretask 實例_java 使用Callable+FutureTask獲取執行結果

之前給大家分享了使用CallableFuture獲取執行結果的java示例,那么下面要給大家分享的就是使用CallableFutureTask獲取執行結果的java示例,一起來看看吧。public class Test{public static void main(String[] args){//方式1ExecutorService executor Ex…