首页 > 解决方案 > Java - 访问 JSON 元素 (llegalFormatConversionException: d !=java.lang.String)

问题描述

我正在尝试学习 JAVA 并为 Minecraft 构建一个插件;我已经成功地从我的 api 端点获取 JSON 数据,但是,我现在面临的问题是 llegalFormatConversionException: d !=java.lang.String 这意味着我试图将其转换为字符串的格式不是等于它正在寻找的字符串类型。

我正在尝试从名为条件的端点访问 JSON 元素

{
    "todaysdate": "2021-02-12",
    "temperature": 25,
    "description": [
        "Overcast"
    ],
    "condition": 122,
}

来自 C#;我知道有一个名为 json2sharp 的网站,您可以在其中为 JSON 创建一个根类。我不确定它将如何在 Java 中应用,但目前,我的代码看起来像这样。

    private String fetchWeather() throws IOException, InvalidConfigurationException {
        // Download
        final URL url = new URL(API);
        final URLConnection request = url.openConnection();

        // Set HEADER
        request.setRequestProperty("x-api-key", plugin.apiKey);


        request.setConnectTimeout(5000);
        request.setReadTimeout(5000);

        request.connect();

        // Convert to a JSON object to print data
        JsonParser jp = new JsonParser(); //from gson
        JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element

        JsonObject rootobj = root.getAsJsonObject(); 
        //JsonElement code = rootobj.get("condition"); 

        String condition_code = rootobj.get("condition").toString();

        plugin.getLogger().fine(String.format(
                "[%s] Weather is %d",
                world.getName(), condition_code
        ));

        return condition_code;
    }

如果我打电话

    private JsonObject fetchWeather() throws IOException, InvalidConfigurationException {
        // Download
        final URL url = new URL(API);
        final URLConnection request = url.openConnection();

        // Set HEADER
        request.setRequestProperty("x-api-key", plugin.apiKey);


        request.setConnectTimeout(5000);
        request.setReadTimeout(5000);

        request.connect();

        // Convert to a JSON object to print data
        JsonParser jp = new JsonParser(); //from gson
        JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element

        JsonObject rootobj = root.getAsJsonObject(); 

        return rootobj;
    }
            state = fetchWeather();
            plugin.getLogger().warning(state.toString());

我确实得到了包含所有元素的实际 JSON,所以我知道 URL 并且访问它是完全有效的,但是如果我尝试使用记录器调用和打印条件代码,我会收到格式错误。

因此,如果我将 fetchWeather() 中的返回类型更改为根 json 对象,然后尝试使用上面的状态变量打印它就可以了;但是如果我尝试返回条件 json 元素并打印它,它会给我一个非法异常。

现在,在我发布这个问题之前,我确实阅读了人们提出的其他一些问题,但我无法从他们建议的答案中获得有效的解决方案。所以,我希望有人能指出我做错了什么,因为我知道我在变量格式的某个地方搞砸了。

谢谢。

Line 37: state = fetchWeather();
Line 103:
        plugin.getLogger().fine(String.format(
                "[%s] Weather is %d",
                world.getName(), bId
        ));

标签: javajsonminecraftbukkit

解决方案


condition_code 变量是字符串。您应该使用 %s 格式说明符。


推荐阅读