Java Json pretty print javax.json

我正在尝试使用javax.json API打印json

我目前使用的代码如下:

private String prettyPrint(String json) { StringWriter sw = new StringWriter(); try { JsonReader jr = Json.createReader(new StringReader(json)); JsonObject jobj = jr.readObject(); Map properties = new HashMap(1); properties.put(JsonGenerator.PRETTY_PRINTING, true); JsonGeneratorFactory jf = Json.createGeneratorFactory(properties); JsonGenerator jg = jf.createGenerator(sw); jg.write(jobj).close(); } catch (Exception e) { } String prettyPrinted = sw.toString(); return prettyPrinted; } 

我收到以下exception:

 11:47:08,830 ERROR [stderr] (EJB default - 1) javax.json.stream.JsonGenerationException: write(JsonValue) can only be called in array context 11:47:08,835 ERROR [stderr] (EJB default - 1) at org.glassfish.json.JsonGeneratorImpl.write(JsonGeneratorImpl.java:301) 11:47:08,838 ERROR [stderr] (EJB default - 1) at org.glassfish.json.JsonPrettyGeneratorImpl.write(JsonPrettyGeneratorImpl.java:55) 11:47:08,841 ERROR [stderr] (EJB default - 1) at org.proactive.rest.VideoFeedService.prettyPrint(VideoFeedService.java:247) 11:47:08,843 ERROR [stderr] (EJB default - 1) at org.proactive.rest.VideoFeedService.requestVideoFeedData(VideoFeedService.java:124) 11:47:08,845 ERROR [stderr] (EJB default - 1) at org.proactive.rest.VideoFeedService.run(VideoFeedService.java:86) 11:47:08,848 ERROR [stderr] (EJB default - 1) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 11:47:08,850 ERROR [stderr] (EJB default - 1) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 11:47:08,852 ERROR [stderr] (EJB default - 1) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 11:47:08,854 ERROR [stderr] (EJB default - 1) at java.lang.reflect.Method.invoke(Method.java:483) 

您应该使用JsonWriter而不是JsonGenerator。

替换这些行:

 JsonGeneratorFactory jf = Json.createGeneratorFactory(properties); JsonGenerator jg = jf.createGenerator(sw); jg.write(jobj).close(); 

用这些:

 JsonWriterFactory writerFactory = Json.createWriterFactory(properties); JsonWriter jsonWriter = writerFactory.createWriter(sw); jsonWriter.writeObject(jobj); jsonWriter.close(); 

您可以使用JsonWriterFactory实现漂亮的打印。 这需要一个属性的配置图。

使用JsonWriter写入StringWriter

我添加了一个方便的方法,它已经为你传递了PRETTY_PRINTING标志。

 public static String prettyPrint(JsonStructure json) { return jsonFormat(json, JsonGenerator.PRETTY_PRINTING); } public static String jsonFormat(JsonStructure json, String... options) { StringWriter stringWriter = new StringWriter(); Map config = buildConfig(options); JsonWriterFactory writerFactory = Json.createWriterFactory(config); JsonWriter jsonWriter = writerFactory.createWriter(stringWriter); jsonWriter.write(json); jsonWriter.close(); return stringWriter.toString(); } private static Map buildConfig(String... options) { Map config = new HashMap(); if (options != null) { for (String option : options) { config.put(option, true); } } return config; } 

这是使用Jersey的javax.jsonjavax.ws.rs进行漂亮打印(缩进)JSON的解决方案:

 @GET @Path("stuff") public Response getStuff(@QueryParam("pretty") boolean pretty) { JsonArrayBuilder stuff = Json.createArrayBuilder().add("foo").add("bar"); JsonObject jsonObject = Json.createObjectBuilder() .add("status", "OK") .add("data", stuff).build(); if (pretty) { Map config = new HashMap<>(); config.put(JsonGenerator.PRETTY_PRINTING, true); JsonWriterFactory jwf = Json.createWriterFactory(config); StringWriter sw = new StringWriter(); try (JsonWriter jsonWriter = jwf.createWriter(sw)) { jsonWriter.writeObject(jsonObject); } // return "Content-Type: application/json", not "text/plain" MediaType mediaType = MediaType.APPLICATION_JSON_TYPE; return Response.ok(sw.toString(), mediaType).build(); } else { return Response.ok(jsonObject).build(); } } 

样本curl输出:

 $ curl -i http://localhost:8080/api/stuff?pretty=true HTTP/1.1 200 OK Content-Type: application/json Date: Fri, 08 Aug 2014 14:32:40 GMT Content-Length: 71 { "status":"OK", "data":[ "foo", "bar" ] } $ curl http://localhost:8080/api/stuff {"status":"OK","data":["foo","bar"]} 

也可以看看:

  • JSR 353:用于JSON处理的Java API: https : //jsonp.java.net
  • 用于JSON处理的Java API(JSON-P): https : //json-processing-spec.java.net
  • 泽西岛: https : //jersey.java.net
  • Java EE 7教程:Java EE RESTful Web服务中的JSON | Java EE文档