2013-03-21 63 views
2

我有不同的fieldNames帶有我感興趣的值的json。他們來自不同的來源。我想把我的興趣領域變成一個普通的名字。例如:Json在java中的預處理

這是原始的JSON:

{"movieName":"A","Leadactor":"","leadActress":"","movieTitle":"","hero":"","heroine":"","source":"IMDB"} 
{"movieName":"","Leadactor":"","leadActress":"","movieTitle":"B","hero":"B1","heroine":"B2","source":"Netflix"} 
{"movieName":"C","Leadactor":"C1","leadActress":"C2","movieTitle":"","hero":"","heroine":"","source":"IMDB"} 
{"movieName":"D","Leadactor":"D1","leadActress":"D2","movieTitle":"","hero":"","heroine":"","source":"IMDB"} 
{"movieName":"","Leadactor":"","leadActress":"","movieTitle":"E","hero":"E1","heroine":"E2","source":"Netflix"} 

源IMDB我感興趣的領域是從源Netflix的興趣領域不同。我的最終目標是在前臺展示他們。所以試圖讓我感興趣的領域進入共同領域。

我想把它轉換成:

{Name:"A",Actor"A1",Actress"A2","source":"IMDB"} 
{Name:"B",Actor"B1",Actress"B2","source":"Netflix"} 
{Name:"C",Actor"C1",Actress"C2","source":"IMDB"} 
{Name:"D",Actor"D1",Actress"D2","source":"IMDB"} 
{Name:"E",Actor"E1",Actress"E2","source":"Netflix"} 

我想到的解決辦法是使用正則表達式來刪除所有領域與空值,那麼替換的movieName和movieTitle到名稱。同樣適用於其他領域。

是否有更好的方法來處理這個問題。(JSON的我得到的是非常巨大的,所以尋找超快速的預處理它。)

+4

使用JSON庫而不是正則表達式。 – 2013-03-21 17:16:43

+0

我之前使用過jackson和gson。他們正在創建Java對象,我認爲它是過時的,以在前端顯示它們。我的意思是我必須爲1000個json結果創建10,000個java對象。我正在尋找超快速和高效內存的方式來做到這一點,因爲我得到的json非常龐大。 – javaMan 2013-03-21 17:19:39

+1

您可以使用簡單的[json-simple](http://code.google.com/p/json-simple/),顧名思義。查看解碼示例編號4,您可以將簡單對象解碼爲地圖,修改地圖並從那裏重新編碼。 – 2013-03-21 17:25:39

回答

1

我的建議是使用GSON和隱蔽以上JSON字符串,這樣的地圖:

Type type = new TypeToken<Map<String, String>>(){}.getType(); 
Map<String, String> map = 
       gson.fromJson("{'key1':'foo','key2':'bar', 'key3', ''}", type); 

一旦你的地圖,然後simlpy迭代並刪除與空值的所有元素。之後,您可以從此地圖生成您的JSON字符串。

+0

嗨@anubhava,我收到了JSON流。我一行一行地閱讀你所說的話。我們的json很大。所以需要10秒來處理。你認爲線程可以幫助這裏或任何其他建議加快速度。 – javaMan 2013-04-03 13:49:42

+0

@javaMan:由於這個問題解決了一個不同的問題(pasring JSON字符串),而不是這個時間問題,我建議你在SO上創建一個新的問題與你的時間問題,這樣你就可以得到更好的答案。 – anubhava 2013-04-03 15:06:39

+0

我在這裏發佈了新問題:http://stackoverflow.com/questions/15794393/json-preprocessing-performance-issue – javaMan 2013-04-03 17:47:40

1

您可以輕鬆地做到這一點通過創建您自己的JSON「加法器?」 json.org有很好的JSON庫,你的代碼看起來像這樣。

public static void addJSON(JSONObject one, JSONObject two){ 
    while(one.keys().hasNext()){ 
     String key = (String) one.keys().next(); 
     try{ 
      if(one.getString(key).equals("")){ 
       one.put(key, two.get(key)); 
      } 
     }catch(JSONException e){ 

     } 
    } 

} 
1

使用JSON流解析器,如json-simpleJackson

它們的速度非常快,內存效率高,可以節省大量編碼頭痛,並且易於在像您這樣的簡單結構上實現。

1

JSON具有上下文無關語法。 REGEX無法可靠地解析這些語法。

例如,這JSON是不可能與正則表達式可靠地解析:

{movie : "Apocalypse Now", director : {first_name: "Francis", last_name: "Ford Coppola"}} 

,因爲它嵌套大括號,正則表達式將下一個匹配最後托架在整個表達式閉。 換句話說,當嵌套表達式(JSON,XML,JavaScript等)使用專門的解析器時,因爲正則表達式無法處理它。