2010-08-05 77 views
5

沉默的沉默!通常你不会在Stackoverflow上遇到这种情况......我已经添加了一个小小的奖励来让事情发展!如何修改大型json字符串?

我已经建立了包含有关各国的位置信息的JSON文档。我已经添加了一些自定义键。这是JSON文件的开头:

{ 
    "type": "FeatureCollection", 
    "features": [ 
     { "type": "Feature", "properties": { 
      "NAME": "Antigua and Barbuda", 
      "banned/censored": "AG", 
      "Bombed": 29, 
      "LON": -61.783000, "LAT": 17.078000 }, 
    "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -61.686668,... 

所有的自定义键(如轰炸,禁止/审查等)有值,但(如果你要假的),他们只是旧值。实际值保存在从excel文档中提取的.csv文件中。

例如,有这个:

      banned/censored  bombed 
Antigua and Barbuda    2     120 
... 

现在我想匹配这些值与正确的键在json文件。有没有我可以使用的任何程序?另一种选择是java的json库,它以某种方式支持我想要的。我还没有找到一个简单的解决方案呢。该文件相当大〜10MB,如果它有任何区别!

编辑:我用QGIS操纵.shp文件,因此某种延伸的可能是使用过。

回答

7

只是转换既JSON和CSV到fullworthy Java对象。通过这种方式,您可以根据自己的喜好编写任何Java逻辑,以根据这些或那个来更改Java对象。最后将表示JSON数据的修改后的Java对象转换回JSON字符串。

然而有你的JSON的一个问题。 banned/censored中的/不是JSON字段名称的有效字符,因此许多现有的JSON解串器可能会对此扼杀。如果你解决这个问题,那么你就可以使用其中的一个。

我可以推荐使用Google Gson对JSON和Java之间的转换。以下是根据您的JSON结构的开球例子(与banned/censored更名为bannedOrCensored):

class Data { 
    private String type; 
    private List<Feature> features; 
} 

class Feature { 
    private String type; 
    private Properties properties; 
    private Geometry geometry; 
} 

class Properties { 
    private String NAME; 
    private String bannedOrCensored; 
    private Integer Bombed; 
    private Double LON; 
    private Double LAT; 
} 

class Geometry { 
    private String type; 
    private Double[][][][] coordinates; 
} 

你只需要添加/生成getter和setter自己。然后,您就可以与JSON和Java喜欢转换如下:

Data data = new Gson().fromJson(jsonString, Data.class); 

为CSV和Java对象之间的转换,只需选择众多CSV解析器之一,像OpenCSV。你甚至可以在BufferedReader的帮助下自己生长。

最后,改变代表JSON数据的Java对象后,你可以用GSON的帮助如下转换回JSON字符串:

​​
+0

这是我希望避免的。无论如何,我会试试看。谢谢! – 2010-08-09 08:04:55

+0

你有什么想法?有些魔力? – BalusC 2010-08-09 11:32:32

+2

支持我正在寻找的一些功能的程序。就像QGIS的扩展一样,或者像魔术一样。 无论如何,你有事情要做。 – 2010-08-10 12:15:42

3

虽然BalusC的答案告诉你如何做到这一点在当前的设置,我有一个更激进的建议:摆脱JSON。

通过JSON的想法并不意味着存储数据 - 这意味着作为一个“轻量级的基于文本的开放标准设计的人类可读数据交换”。那就是:

  • 低流量(如小非有意义的数据越好)
  • 人类可读
  • 容易与动态语言

,另一方面数据存储器必须处理比这更多的要求。这就是数据库存在的原因。因此,将存储移动到数据库。如果你不想要一个全功能的数据库,可以使用类似HSQLDB或JavaDB的东西。

+0

你说得对。我不喜欢JSON来存储数据。但是当我使用OpenLayers和.shp文件时,我认为这是最简单的使用格式,因为OpenLayers使用geojson,.shp文件可以通过gdal转换为geojson。 – 2010-08-10 12:20:28