如何修改大型json字符串?

时间:2010-08-05 11:00:50

标签: java excel json csv

死寂!您经常不会在Stackoverflow上体验到这一点...我已经添加了一笔不小的奖金来推动工作!

我已经构建了一个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文件,因此也可以使用某种扩展名。

2 个答案:

答案 0 :(得分:7)

只需将JSON和CSV转换为完整的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字符串,如下所示:

String json = new Gson().toJson(data);

答案 1 :(得分:3)

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

根据想法,JSON并不意味着存储数据 - 它旨在用作“基于文本的轻量级开放标准,专为人类可读的数据交换而设计”。那就是:

  • 流量低(尽可能少的无意义数据)
  • 人类可读
  • 易于使用动态语言处理

另一方面,数据存储要求比这更多。这就是数据库存在的原因。因此,将存储移动到数据库。如果您不想使用功能齐全的数据库,请使用HSQLDB或JavaDB等。