2013-10-03 59 views
33

的JSON對象我收到這樣的容貌:如何測試是否JSON對象爲空在Java中

[{"foo1":"bar1", "foo2":"bar2", "problemkey": "problemvalue"}] 

我試圖來測試是problemvalue存在。如果problemvalue返回一個JSON對象,我很高興。如果不是,它將返回爲{}。我如何測試這種情況?我已經嘗試了幾件事情無濟於事。

這是我迄今爲止嘗試:

//  if (obj.get("dps") == null) { //didn't work 
//  if (obj.get("dps").equals("{}")) { //didn't work 
if (obj.isNull("dps")) { //didn't work 
    System.out.println("No dps key"); 
} 

我預計這些線路的一個打印「沒有DPS的關鍵」,因爲{"dps":{}},但無論出於何種原因,事實並非如此。我正在使用org.json。該jar文件是org.json-20120521.jar

+0

你爲什麼不只是'通信System.err.println(obj.get(」 DPS「))'? – djechlin

+0

@djechlin,thx的建議。它返回「{}」,但由於某種原因,它並沒有達到我上面的第二條語句。 =(它不包含任何多餘的空格b/ci使用此行來確保System.out.println(「這是什麼dps是:」+ obj.get(「dps」)+「zzz」); – Classified

+1

'equals()'方法可能不起作用,因爲當你將對象輸出到控制檯時,Java會在對象上調用'toString()'來生成值'「{}」'但是當你'重新調用'.equals(「{}」)',你正在比較一些可能不是String的'Object'到'String'。作爲一個解決方法,你可以這樣做:'obj.get(「dps 「).toString()。equals(」{}「)',但它最多隻是一個黑客解決方案 –

回答

86
obj.length() == 0 

是我會做的。

+1

由於它很短,因此會自動標記爲低質量。你介意加入一些文字來解釋它是如何解決問題的嗎? – gung

+1

@gung只會讓這個答案*變得更糟*。有一個原因低質量*標誌*不自動刪除答案。 – djechlin

+0

@gung接受的答案也一樣短。這很直接,如何解決這個問題。 –

2

嘗試:

if (record.has("problemkey") && !record.isNull("problemkey")) { 
    // Do something with object. 
} 
+0

thx的建議。當我嘗試你的代碼時,它認爲{}不是null並打印我的消息,這不是我想要的。我不知道它爲什麼認爲{}不爲null。 – Classified

-1

嘗試/*string with {}*/ string.trim().equalsIgnoreCase("{}")),也許有一些多餘的空格或東西

+0

thx的建議。我查了一下,沒有多餘的空格。 =( – Classified

6

一個JSON符號{}表示空對象,這意味着沒有成員的對象。這與null不一樣。由於您試圖將其與字符串「{}」進行比較,因此它們都不是字符串。 我不知道哪個JSON庫是您使用,而是試圖尋找方法是這樣的:

isEmptyObject() 
+3

thx爲您的建議。我使用org.json(jar文件org.json-20120521.jar)。它看起來不像有一個方法稱爲isEmptyObject。=( – Classified

+0

@Classified我不熟悉組織.json所以這可能不是最佳方法,因爲空對象沒有成員,所以方法keys()應該返回長度爲零的迭代器。getJSONObject(「problemkey」)。keys() - 檢查長度。 – Anderson

+0

哪個庫你使用了嗎?我通過谷歌搜索找到了org.json,所以我不知道它有多好/多壞,但看起來相當流行。http://www.json.org/javadoc/org/json/JSONObject.html 。thx再次爲您的迴應和幫助 – Classified

0
Object getResult = obj.get("dps"); 
if (getResult != null && getResult instanceof java.util.Map && (java.util.Map)getResult.isEmpty()) { 
    handleEmptyDps(); 
} 
else { 
    handleResult(getResult); 
} 
25

如果您能夠接受一個黑客 -

obj.toString().equals("{}"); 
+22

或更好'jsonObject.length()== 0' – hgoebl

+8

'jsonObject.length()'是正確的方法。如果您有一個潛在的大對象,obj.toString()在進行比較之前序列化整個對象,這可能很昂貴。 –

-1

使用下面的代碼:

if(json.isNull()!= null){ //returns true only if json is not null 

} 
+0

演員將如何去? –

0

我已經加入的isEmpty()上的JSONObject和JSONArray方法()

//on JSONObject 
public Boolean isEmpty(){   
    return !this.keys().hasNext(); 
} 

...

//on JSONArray 
public Boolean isEmpty(){ 
    return this.length()==0;   
} 

,你可以在這裏https://github.com/kommradHomer/JSON-java

2

我會做下列檢查空對象

obj.similar(new JSONObject()) 
+0

這實際上很聰明。我不會在這麼小的事情上使用它,但它絕對不是我以前想過的空白支票。 – Csteele5

0

如果JSON用時紀錄是ArrayNode以下結構返回:

{}client 
    records[] 

而你想檢查記錄節點是否有東西 然後你可以使用方法size();

if (recordNodes.get(i).size() != 0) {} 
0
if (jsonObj != null && jsonObj.length > 0) 

要檢查是否有嵌套的JSON對象是一個JSONObject內空:

if (!jsonObject.isNull("key") && jsonObject.getJsonObject("key").length > 0) 
+1

請看[如何格式化我的代碼塊?](https://meta.stackoverflow.com/questions/251361/how-do-i-format-my-code-blocks),然後向您的代碼添加一些解釋回答。 – Clijsters

0
@Test 
public void emptyJsonParseTest() { 
    JsonNode emptyJsonNode = new ObjectMapper().createObjectNode(); 
    Assert.assertTrue(emptyJsonNode.asText().isEmpty()); 
}