2017-08-14 6 views
0

以下は私のサンプルjsonファイルで、車に関する情報を提供しています。私は一度に下のjsonデータから "city"を削除したかったのです。 jsonデータには非常に多くの都市ノードが含まれているため、「都市」ノードを削除するために各ノードを解析する必要はありません。それぞれのノードを解析せずに "city" ノードを最も簡単な方法で削除したいと思います。私は文字列を空に置き換えてみましたが、それは大きなデータですが、場合によっては失敗することがあります。もっと深いところで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、これは良いようですが、私が持っている疑いがあるのは非常に大きなファイルです。これでファイル内の膨大なデータからノードを削除できますか –

関連する問題