2014-02-27 87 views
0

例子:從JSON遇到問題提取值

{"name":"tv.twitch:twitch:5.16"} 

{"name":"tv.twitch:twitch-external-platform:4.5","extract":{"exclude":["META-INF/"]},"natives":{"windows":"natives-windows-${arch}"},"rules":[{"os":{"name":"windows"},"action":"allow"}]} 

這些線路從JSONArray來了,我想提取「土人」部分。問題是,並不是JSONArray中的所有項都具有「本地」值。這裏是我當前的代碼來提取「名稱」值

JSONObject json = new JSONObject(readUrl(url.toString())); 
JSONArray jsonArray = json.getJSONArray("libraries"); 

ArrayList<String> libraries = new ArrayList<String>(); 
for (int i = 0; i < jsonArray.length(); i++) { 
    JSONObject next = jsonArray.getJSONObject(i); 
    String lib = next.getString("name"); 
    libraries.add(lib); 
} 

我不完全相信這個,因爲我是新來的Java/JSON解析,但會在數組中的對象沒有「土人」的價值導致程序結束?

+1

如果您使用'json.org'類; 'JSONObject'有一個'has(String)'方法來判斷一個鍵是否存在。 – qqilihq

+0

我需要「姓名」,「本地人」,在這種情況下,「windows」 – ReidandKat

+0

只需使用'try-catch'塊即可獲得「本地人」價值。 – nikis

回答

1

您可以使用JSONObject中的has方法來確定它是否包含指定的鍵。

確定JSONObject是否包含特定鍵。

在你的情況,你可以這樣做:

JSONObject json = new JSONObject(readUrl(url.toString())); 
if(json.has("natives")) { 
    //Logic to extract natives 
} else { 
    //Logic to extract without natives 
} 

我覺得這個簡單的線條應該能滿足您的要求。查看API:here

+0

是的,這正是qqilihq提到的關於「has」方法後所做的事情 – ReidandKat

+0

如果它適合您,請接受答案;) –

1

您似乎想要提取內容JSON Pointer s /name/extract/natives/windows

在這種情況下,使用this library(它取決於傑克遜),它是簡單的:

// All of these are thread safe 
private static final ObjectReader READER = JacksonUtils.getReader(); 
private static final JsonPointer NAME_POINTER = JsonPointer.of("name"); 
private static final JsonPointer WINDOWS_POINTER 
    = JsonPointer.of("extract", "native", "windows"); 

// Fetch content from URL 
final JsonNode content = READER.readTree(url.getInputStream()); 
// Get content at pointers, if any 
final JsonNode nameNode = NAME_POINTER.path(content); 
final JsonNode windowsNode = WINDOWS_POINTER.path(content); 

然後,檢查是否節點實際存在,檢查針對.isMissingNode()

if (windowsNode.isMissingNode()) 
    // deal with no windows content 

或者,使用.get()而不是.path(),而是檢查null