首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Json漂亮打印javax.json

Java Json漂亮打印javax.json
EN

Stack Overflow用户
提问于 2014-04-11 16:39:40
回答 3查看 13.8K关注 0票数 18

我正在尝试使用javax.json API漂亮地打印json。

我目前使用的代码如下:

代码语言:javascript
复制
private String prettyPrint(String json) {
        StringWriter sw = new StringWriter();

        try {
            JsonReader jr = Json.createReader(new StringReader(json));

            JsonObject jobj = jr.readObject();



            Map<String, Object> 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;
    }

我得到了以下异常:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-03 02:48:01

您应该使用JsonWriter而不是JsonGenerator。

替换这些行:

代码语言:javascript
复制
JsonGeneratorFactory jf = Json.createGeneratorFactory(properties);
JsonGenerator jg = jf.createGenerator(sw);

jg.write(jobj).close();

有了这些:

代码语言:javascript
复制
JsonWriterFactory writerFactory = Json.createWriterFactory(properties);
JsonWriter jsonWriter = writerFactory.createWriter(sw);

jsonWriter.writeObject(jobj);
jsonWriter.close();
票数 15
EN

Stack Overflow用户

发布于 2015-09-10 19:39:00

您可以利用JsonWriterFactory实现漂亮的打印效果。这需要一个属性的配置映射。

使用JsonWriter写入StringWriter

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

代码语言:javascript
复制
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<String, Boolean> config = buildConfig(options);
    JsonWriterFactory writerFactory = Json.createWriterFactory(config);
    JsonWriter jsonWriter = writerFactory.createWriter(stringWriter);

    jsonWriter.write(json);
    jsonWriter.close();

    return stringWriter.toString();
}

private static Map<String, Boolean> buildConfig(String... options) {
    Map<String, Boolean> config = new HashMap<String, Boolean>();

    if (options != null) {
        for (String option : options) {
            config.put(option, true);
        }
    }

    return config;
}
票数 14
EN

Stack Overflow用户

发布于 2014-08-08 23:00:21

这里有一个使用javax.jsonjavax.ws.rs的漂亮打印(缩进) JSON的解决方案:

代码语言:javascript
复制
@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<String, Boolean> 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输出示例:

代码语言:javascript
复制
$ 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"]}

另请参阅:

JSON API for JSON Processing:https://jsonp.java.net

  • The Java EE 7 Tutorial:JSON in Java EE RESTful Web Services | Java EE Documentation
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23007567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档