Json文件在Java中读取

时间:2014-12-27 14:14:20

标签: java json

我想读一个看起来像这样的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

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);
    }
}

JsonNodeObjectMapperJackson 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许可的。

https://code.google.com/p/google-gson/