2013-03-03 77 views
1

在我下面的代碼,colDataJSON String。對於colData-解析JSON字符串有效和清潔的方式

{"lv":[{"v":{"price":70.0,"userId":419},"cn":3}, 
     {"v":{"price":149.99,"userId":419},"cn":3}, 
     {"v":{"price":54.95,"userId":419},"cn":3}], 
"lmd":20130206212543} 

樣品例如現在我想在上面JSON String匹配id值與userId值。我從不同的來源得到id價值。 含義如果id值爲419再在上面JSON字符串userId值也應該是419。而在JSON字符串,有可能有很多userId values所以所有的userId值應與id進行匹配。如果其中任何一個不匹配,則記錄異常。

所以我試圖像這 -

final int id = generateRandomId(random); 

for (String str : colData) { 
    if (!isJSONValid(str, id)) { 
     // log the exception here 
     LOG.error("Invalid JSON String " +str+ "with id" +id); 
    } 
} 

public boolean isJSONValid(final String str, final int id) { 
    boolean valid = false; 
    try { 
     final JSONObject obj = new JSONObject(str); 
     final JSONArray geodata = obj.getJSONArray("lv"); 
     final int n = geodata.length(); 

     for (int i = 0; i < n; ++i) { 
      final JSONObject person = geodata.getJSONObject(i); 
      JSONObject menu = person.getJSONObject("v"); 
      if(menu.getInt("userId") == id) { 
       valid = true; 
      } 
     } 
    } catch (JSONException ex) { 
     valid = false; 
    } 
    return valid; 
} 

按我的理解,它看起來像我可以讓isJSONValid方法更加清潔。在我上面的isJSONValid方法中,我重複了一些我不應該做的事情。任何人都可以幫我解決如何讓這個更清潔,如果我錯過了什麼。我將能夠學到更多的東西。感謝您的幫助

+0

你只需要一個匹配,使之好,還是隻有一個錯配,使之壞?如果前者,設置後的「break」有效爲true。如果是後者,你需要在第一次設置無效後反轉有效(和if測試)和「break」。 – 2013-03-03 20:25:18

+0

一旦發現任何不匹配,我需要記錄異常。我對你所描述的方式感到困惑。你能用例子來解釋嗎?謝謝您的幫助。 – AKIWEB 2013-03-03 20:27:22

+0

想想吧 - 如果你需要的一切匹配,那麼第一個*匹配*意味着你可以退出並報告「壞」。如果你一直通過它是「好」。 – 2013-03-03 21:28:44

回答

3

可以初始化valid = true並將其設置爲false,當你發現一個非有效userId並立即失敗:

public boolean isJSONValid(final String str, final int id) { 
    boolean valid = true; 
    try { 
     final JSONObject obj = new JSONObject(str); 
     final JSONArray geodata = obj.getJSONArray("lv"); 
     final int n = geodata.length(); 

     for (int i = 0; i < n; ++i) { 
      final JSONObject person = geodata.getJSONObject(i); 
      JSONObject menu = person.getJSONObject("v"); 
      if(menu.getInt("userId") != id) { 
       valid = false; 
       break; 
      } 
     } 
    } catch (JSONException ex) { 
     valid = false; 
    } 
    return valid; 
} 

這樣,你通過所有數組元素迭代僅當所有人都有效,這是你實際需要的唯一情況。

+0

感謝yair的建議。現在有道理。除了這個修復之外,在我的代碼中一切看起來都不錯?無論我做了什麼是對的?正如我想的那樣,我在這裏重複一些代碼行。 – AKIWEB 2013-03-03 20:31:26

+0

@ Nevzz03我沒有看到任何重複的代碼行...我唯一會改變的代碼是使用String.format來記錄excepion,並且可能從像'userId','v'這樣的字符串創建常量'和'lv' – dantuch 2013-03-03 20:37:25

+0

除了幾次使用'getJSONObject'外,我沒有看到任何重複行,但是您可以在您的JSON中使用它來獲取特定的屬性。除非這是打算成爲一般JSON查詢指定的實用程序方法,否則您的代碼看起來非常簡潔。過了一次閱讀你的代碼(和你的doumentation( - ;),以幫助你,它很乾淨 – yair 2013-03-03 20:38:23