如何在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
相关产品推荐
相关产品推荐

