You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Codename One中将紧凑JSON转为格式化输出并解析

在Codename One中解析JSON响应:避免格式化,直接处理原始数据

首先得帮你理清核心问题:你遇到的解析错误,根本不是因为JSON是紧凑格式导致的——紧凑JSON本身完全可以被正常解析,问题出在你错误地把JsonResponse的toString()结果当作标准JSON字符串来二次解析了。Codename One的JsonResponse已经帮你完成了解析工作,不需要再绕一圈转字符串重新解析。

直接使用已解析的响应数据(最优方案)

Rest.post(...).getAsJsonMap()返回的JsonResponse对象,内部已经封装了解析好的JSON结构。你可以直接通过getResponseData()获取对应的Map或JSON对象,完全跳过二次解析的步骤。修改后的代码如下:

String JsonData = "{\"document\":{ \"type\":\"PLAIN_TEXT\", \"content\":\"Ask not what your country can do for you, ask what you can do for your country.\" },\"encodingType\":\"UTF8\"}";
// 注意你的API URL末尾少了闭合的],记得补上
JsonResponse jsonResponse = Rest.post("https://language.googleapis.com/v1/documents:analyzeSyntax?key=[API KEY]")
        .jsonContent()
        .body(JsonData)
        .getAsJsonMap();
// 直接拿到解析好的Map,无需再用JSONParser
Map<String, Object> results = (Map<String, Object>) jsonResponse.getResponseData();
System.out.println("results " + results);

若确实需要格式化JSON(仅用于调试)

如果你只是想把紧凑JSON转成易读的格式化输出(比如调试时查看),可以用Codename One自带的JSONFormatter类:

// 假设你有一个外部获取的紧凑JSON字符串
String compactJson = "{\"key\":\"value\",\"array\":[1,2,3],\"nested\":{\"foo\":\"bar\"}}";
JSONParser parser = new JSONParser();
try {
    Map<String, Object> jsonMap = parser.parseJSON(new StringReader(compactJson));
    // 格式化输出
    JSONFormatter formatter = new JSONFormatter();
    String prettyJson = formatter.format(jsonMap);
    System.out.println(prettyJson);
} catch (IOException e) {
    e.printStackTrace();
}

注意:格式化只是为了人类可读性,实际解析时完全不需要这一步,紧凑JSON的解析效率反而更高。

你原代码的错误根源

你原代码中JsonResponse.getResponseData().toString()得到的不是标准JSON字符串,而是Codename One内部JSON对象的toString()表示(包含非JSON格式的内容),这才导致JSONParser解析时抛出格式错误(比如你看到的Expected null for key value和NumberFormatException)。

内容的提问来源于stack exchange,提问作者Max Litvak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:02:51