使用文件中的 json 数据填充哈希图

populate a hashmap with json data from file

我想在我的 java 程序中代表 this file

我想做的是通过 "key" 值快速搜索它,例如,给定值 P26 我想 return spouse .

我以为我可以这样做:

BufferedReader reader = new BufferedReader(new FileReader(new File("properties-es.json")));
        Map<String, HashMap<String, Object>> map = 
        new Gson().fromJson(reader, new TypeToken<HashMap<String, HashMap<String, Object>>>() {}.getType());

这是根据键名获取值

String value = (String) map.get("properties").get("P6");
System.out.println(value);

但实际上当我 运行 的第一位时,我得到了错误:

  Expected BEGIN_ARRAY but was STRING at line 1347 column 10

我为简化数据结构而修改的文件的那部分如下所示: (^这是个坏主意吗?原始文件是否适合在我描述的散列图中表示?)

    "P1655": "station number",
    "P1656": "unveiled by",
    "P1657": "MPAA film rating",
    "P1658": "number of faces"

}

我这样做是因为他们原来的 file 似乎是一个更复杂的数据结构。正如我之前所说,我想要做的是启用那些 "P values"

的查询能力

我认为以 P 值作为键,以单词作为值的散列图是实现此目的的最佳方式,但我该如何实现?

到目前为止我一直在使用gson。

问题是 "missing" 属性 的值是字符串数组,而不是对象或对象数组。按照您使用 Gson 的方式,除了抛出错误外,它什么也做不了。您需要分别处理 "properties""missing" 值。

您的 TypeToken 与文件内容的结构不匹配,特别是那个数组 ("missing")。

您可以创建一个数据 class,其中包含与您的文件相同的字段,或者保持简单,只需执行以下操作:

BufferedReader reader = new BufferedReader(new FileReader(new File("properties-es.json")));
        Map<String, Map<String, Object>> map = 
        new Gson().fromJson(reader, HashMap.class);

您将收到一个编译器警告,可以将其抑制,但它应该可以正常工作。

随着数据class:

// if inner class add "static"
public class Data {
    public Map<String,String> properties;
    public List<String> missing;
}

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