2017-08-14 69 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,这看起来不错,但只有怀疑我有非常大的文件。这可以从文件中的大量数据中删除节点 –