我想读一个看起来像这样的json文件:
{"default-values":[
{"name":"cobblestone", "value":1},
{"name":"dirt", "value":1},
{"name":"sand", "value":1},
{"name":"diamond", "value":8192},
{"name":"redstone", "value":64},
{"name":"iron_ingot", "value":256}
]}
我想要做的是创建一个方法,其中某人键入JsonFileReader.getValue(String name)并让它以整数形式返回值。
我该怎么做?
顺便说一句,我收到的错误是:
java.lang.IllegalStateException: Expected a name but was BEGIN_OBJECT at line 1 column 2
答案 0 :(得分:1)
使用以下代码时,我可以阅读您提供的JSON内容。要阅读文件,请使用简单的InputStream
(此版本使用getClass().getResourceAsStream()
方法进行阅读,但任何类型的InputStream
(例如URL.openConnection()
或FileInputStream
都可以使用相同。
public class JsonFileReader {
private Map<String, Integer> defaultValues = new HashMap<>();
public static void main(String... args) throws IOException {
final JsonFileReader reader = new JsonFileReader("/foo.json");
System.out.println(reader.getValue("cobblestone")); // -> 1
}
public JsonFileReader(String filename) throws IOException {
try (InputStream stream = getClass().getResourceAsStream(filename)) {
ObjectMapper mapper = new ObjectMapper();
final JsonNode result = mapper.readTree(stream);
for (JsonNode defaultValue : result.path("default-values")) {
defaultValues.put(
defaultValue.get("name").asText(),
defaultValue.get("value").asInt());
}
}
}
public Integer getValue(String name) {
return defaultValues.get(name);
}
}
JsonNode
和ObjectMapper
是Jackson library的一部分。 Jackson是一套用于Java的数据处理工具,包括JSON解析和生成库。只需将以下内容添加到pom.xml
(或类似)中即可访问正确的库:
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
编辑:* OP表示他们没有使用Java 7+。 {5}版本的try
语句看起来像下面的详细代码示例。
public JsonFileReader(String filename) throws IOException {
InputStream stream = null;
try {
stream = getClass().getResourceAsStream(filename);
ObjectMapper mapper = new ObjectMapper();
final JsonNode result = mapper.readTree(stream);
for (JsonNode defaultValue : result.path("default-values")) {
defaultValues.put(
defaultValue.get("name").asText(),
defaultValue.get("value").asInt());
}
} finally {
if (stream != null) {
stream.close();
}
}
}
答案 1 :(得分:0)
您可能需要查看google-gson库,以便在Java中执行Json操作/读取。它是Apache许可的。