2017-08-14 61 views
0

以下是我的示例json文件,其中包含關於汽車的信息,我想一次從下面的json數據中刪除「城市」。 由於json數據包含的太多城市節點非常貧乏,我不想通過每個節點解析來移除「城市」節點。我想以最簡單的方式刪除「城市」節點,而無需解析每個節點。我查看空字符串替換,但它是大數據,在某些情況下可能會失敗。在更深層次上刪除json節點的更好方法

任何人都可以告訴我,刪除「城市」節點有什麼更好的方法。

{ 
"carDetails": 
[ 
    { 
     "name":"John", 
     "city":"Berlin", 
     "cars":[ 
      "audi", 
      "bmw", 
      "skoda": { 
       "model": "f3z2", 
       "manfactureDetails": { 
        "city": "vegas", 
        "time": "123967878734", 
        "color": "white", 
        "rawMaterial": { 
          "city": "london", 
          "quality": 1, 
          "importedDetails":{ 
           "city" : "chile", 
           "date": "12/jan/2015", 
           ........... 
          } 

        } 
       } 
      } 
     ], 
     "job":"Teacher" 
    }, 
    { 
     "name":"Mark", 
     "city":"Oslo", 
     "cars":[ 
      "VW", 
      "Toyata" { 
       "manfactureDetails": { 
        "city" : "losangels", 
        ................. 
          .................. 
       } 
      } 

     ], 
     "job":"Doctor" 
    } 
] 
} 

回答

0

使用jsonia,您可以刪除字段 「對飛」:

public static void main(String[] args) { 
    try (InputStream stream = new FileInputStream("test.json")) { 
     try (OutputStream os = new FileOutputStream("output.json"); 
       Writer writer = new OutputStreamWriter(os, "UTF-8"); 
       PrintWriter out = new PrintWriter(writer)) { 
      JSonHandler formatter = new JSonFormatter(out, true); 
      ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
      JSonHandler handler = (JSonHandler) Proxy.newProxyInstance(cl, 
        new Class<?>[] {JSonHandler.class}, 
        new MyHandler(formatter)); 
      JSonParser.parse(stream, "UTF-8", handler); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

的類MyHandler的看起來是這樣的:

private static class MyHandler implements InvocationHandler { 
    private int level = 0; 
    private final Object delegate; 

    public MyHandler(Object delegate) { 
     this.delegate = delegate; 
    } 

    @Override 
    public Object invoke(Object proxy, Method method, 
      Object[] args) throws Throwable { 
     if (method.getName().equals("startField") 
       && args[0].equals("city")) { 
      ++level; 
     } else if (method.getName().equals("endField") 
       && args[0].equals("city")) { 
      --level; 
     } else if (level == 0) { 
      return method.invoke(delegate, args); 
     } 
     return null; 
    } 
} 
+0

謝謝你的答案@Maurice佩裏,該庫在LGPL許可下,如果我們使用Jsonia庫,我們是否需要共享我們的代碼? –

+0

@ M.S.Naidu no:用你的GPL,但不用LGPL。 –

+0

感謝@Maurice,這看起來不錯,但只有懷疑我有非常大的文件。這可以從文件中的大量數據中刪除節點 –

相關問題