Java中的Pretty-Print JSON

mab*_*zer 191 java json pretty-print json-simple

我正在使用,我需要漂亮地打印JSON数据(使其更具人性化).

我无法在该库中找到此功能.这通常是如何实现的?

Ray*_*lha 259

GSON可以很好地做到这一点:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(uglyJSONString);
String prettyJsonString = gson.toJson(je);
Run Code Online (Sandbox Code Playgroud)

  • 可以在不需要额外库的情况下回答OP的问题,因为您可以简单地访问嵌入在Rhino中的JSON解析器(JDK 1.7及更高版本).我不认为为了格式化一些调试输出而将库添加到项目中是不可取的.`scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString),null,2)");` (2认同)
  • 与 org.json 替代方案相比,GSON 漂亮打印方式在转换后保持元素的顺序不变。 (2认同)
  • JsonParser 已弃用:/sf/answers/4437848201/ (2认同)

Rag*_*ran 137

我使用org.json内置方法来漂亮地打印数据.

JSONObject json = new JSONObject(jsonString); // Convert text to object
System.out.println(json.toString(4)); // Print it with specified indentation
Run Code Online (Sandbox Code Playgroud)

JSON中的字段顺序是每个定义随机的.特定订单受解析器实现的影响.

  • 我也更喜欢这个解决方案,因为您不需要像其他答案建议那样导入其他依赖项. (4认同)
  • 缺少重要的导入-导入org.json.JSONObject; (3认同)
  • 无论如何,是否有没有随机顺序的字段,我希望它按照我添加它们的顺序? (2认同)

Buf*_*alo 34

似乎GSON支持这一点,虽然我不知道你是否想从你正在使用的库中切换.

来自用户指南:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);
Run Code Online (Sandbox Code Playgroud)

  • GSON的问题,它很复杂,json-simple要容易得多. (4认同)

小智 22

与杰克逊(com.fasterxml.jackson.databind):

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject))
Run Code Online (Sandbox Code Playgroud)

来自:如何启用漂亮的打印JSON输出(杰克逊)

我知道这已经在答案中,但是我想在这里单独编写它,因为很可能,你已经将Jackson作为一个依赖项,所以你需要的只是额外的一行代码

  • 如果你的字符串中有一个 json,你可以这样做: ```ObjectMapper mapper = new ObjectMapper(); mapper.writerWithDefaultPrettyPrinter().writeValueAsString(mapper.readTree(jsonString));``` (6认同)

bdo*_*han 20

如果您正在使用Java API进行JSON处理(JSR-353)实现,那么您可以JsonGenerator.PRETTY_PRINTING在创建时指定该属性JsonGeneratorFactory.

以下示例最初发布在我的博客文章中.

import java.util.*;
import javax.json.Json;
import javax.json.stream.*;

Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JsonGenerator.PRETTY_PRINTING, true);
JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties);
JsonGenerator jg = jgf.createGenerator(System.out);

jg.writeStartObject()                    // {
    .write("name", "Jane Doe")           //    "name":"Jane Doe",
    .writeStartObject("address")         //    "address":{
        .write("type", 1)                //        "type":1,
        .write("street", "1 A Street")   //        "street":"1 A Street",
        .writeNull("city")               //        "city":null,
        .write("verified", false)        //        "verified":false
    .writeEnd()                          //    },
    .writeStartArray("phone-numbers")    //    "phone-numbers":[
        .writeStartObject()              //        {
            .write("number", "555-1111") //            "number":"555-1111",
            .write("extension", "123")   //            "extension":"123"
        .writeEnd()                      //        },
        .writeStartObject()              //        {
            .write("number", "555-2222") //            "number":"555-2222",
            .writeNull("extension")      //            "extension":null
        .writeEnd()                      //        }
    .writeEnd()                          //    ]
.writeEnd()                              // }
.close();
Run Code Online (Sandbox Code Playgroud)


Ben*_*ngt 18

使用GSON在一行中进行漂亮打印:

System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(jsonString)));
Run Code Online (Sandbox Code Playgroud)

除了内联之外,这相当于接受的答案.


Agn*_*nes 17

我的情况是我的项目使用了一个不支持漂亮打印的遗留(非JSR)JSON解析器.但是,我需要生成漂亮的JSON样本; 只要您使用Java 7及更高版本,就可以在不添加任何额外库的情况下实现:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine scriptEngine = manager.getEngineByName("JavaScript");
scriptEngine.put("jsonString", jsonStringNoWhitespace);
scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
String prettyPrintedJson = (String) scriptEngine.get("result");
Run Code Online (Sandbox Code Playgroud)

  • 这很棒,使用js引擎来做到这一点,简单得多 (2认同)

Har*_*hna 14

使用 org json。参考链接

JSONObject jsonObject = new JSONObject(obj);
String prettyJson = jsonObject.toString(4);
Run Code Online (Sandbox Code Playgroud)

使用 Gson。参考链接

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(obj);
Run Code Online (Sandbox Code Playgroud)

使用杰克逊。参考链接

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String json = mapper.writeValueAsString(obj);
Run Code Online (Sandbox Code Playgroud)

使用金森。参考链接

Genson prettyGenson = new GensonBuilder().useIndentation(true).create();
String prettyJson = prettyGenson.serialize(obj);
Run Code Online (Sandbox Code Playgroud)

使用 javax.json。参考链接

Map<String, Boolean> config = new HashMap<>();

config.put(JsonGenerator.PRETTY_PRINTING, true);

JsonWriterFactory writerFactory = Json.createWriterFactory(config);
Writer writer = new StringWriter();

writerFactory.createWriter(writer).write(jsonObject);

String json = writer.toString();
Run Code Online (Sandbox Code Playgroud)

使用 Moshi 库。参考链接

String json = jsonAdapter.indent("  ").toJson(emp1);
Run Code Online (Sandbox Code Playgroud)

(或者)

Buffer buffer = new Buffer();
JsonWriter jsonWriter = JsonWriter.of(buffer);
jsonWriter.setIndent("   ");

jsonAdapter.toJson(jsonWriter, emp1);

json = buffer.readUtf8();
Run Code Online (Sandbox Code Playgroud)


ask*_*der 7

现有的大多数答案要么取决于某些外部库,要么需要特殊的Java版本。这是一个仅使用常规Java API(可在Java 7中获得更高版本;尽管未尝试使用旧版本)的漂亮代码,但仍可以漂亮地打印JSON字符串的简单代码。

基本思想是基于JSON中的特殊字符来简化格式。例如,如果观察到'{'或'[',则代码将创建新行并增加缩进级别。

免责声明:我仅在一些简单的JSON情况(基本键值对,列表,嵌套JSON)中对此进行了测试,因此对于更通用的JSON文本(例如带引号的字符串值或特殊字符(\ n,\ t等)。

/**
 * A simple implementation to pretty-print JSON file.
 *
 * @param unformattedJsonString
 * @return
 */
public static String prettyPrintJSON(String unformattedJsonString) {
  StringBuilder prettyJSONBuilder = new StringBuilder();
  int indentLevel = 0;
  boolean inQuote = false;
  for(char charFromUnformattedJson : unformattedJsonString.toCharArray()) {
    switch(charFromUnformattedJson) {
      case '"':
        // switch the quoting status
        inQuote = !inQuote;
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ' ':
        // For space: ignore the space if it is not being quoted.
        if(inQuote) {
          prettyJSONBuilder.append(charFromUnformattedJson);
        }
        break;
      case '{':
      case '[':
        // Starting a new block: increase the indent level
        prettyJSONBuilder.append(charFromUnformattedJson);
        indentLevel++;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        break;
      case '}':
      case ']':
        // Ending a new block; decrese the indent level
        indentLevel--;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ',':
        // Ending a json item; create a new line after
        prettyJSONBuilder.append(charFromUnformattedJson);
        if(!inQuote) {
          appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        }
        break;
      default:
        prettyJSONBuilder.append(charFromUnformattedJson);
    }
  }
  return prettyJSONBuilder.toString();
}

/**
 * Print a new line with indention at the beginning of the new line.
 * @param indentLevel
 * @param stringBuilder
 */
private static void appendIndentedNewLine(int indentLevel, StringBuilder stringBuilder) {
  stringBuilder.append("\n");
  for(int i = 0; i < indentLevel; i++) {
    // Assuming indention using 2 spaces
    stringBuilder.append("  ");
  }
}
Run Code Online (Sandbox Code Playgroud)


Enr*_*tín 6

在JSONLib中,您可以使用:

String jsonTxt = JSONUtils.valueToString(json, 8, 4);
Run Code Online (Sandbox Code Playgroud)

来自Javadoc:


Sri*_*bat 6

现在可以使用JSONLib库实现这一点:

http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONObject.html

如果(且仅当)您使用重载toString(int indentationFactor)方法而不是标准toString()方法.

我已在以下版本的API上验证了这一点:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20140107</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个库可能有助于回答这个问题,但最好包含_example_它如何适用于某些_explanation_问题,以及它是如何工作的. (3认同)

Joh*_*urt 6

在一行中:

String niceFormattedJson = JsonWriter.formatJson(jsonString)
Run Code Online (Sandbox Code Playgroud)

json-io libray(https://github.com/jdereg/json-io)是一个小型(75K)库,除了JDK之外没有其他依赖项.

除了漂亮打印JSON之外,您还可以将Java对象(带有循环的整个Java对象图)序列化为JSON,并将其读入.


Jen*_*gsa 5

遵循JSON-P 1.0规范(JSR-353),给定JsonStructureJsonObjectJsonArray)的最新解决方案可能如下所示:

import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import javax.json.Json;
import javax.json.JsonStructure;
import javax.json.JsonWriter;
import javax.json.JsonWriterFactory;
import javax.json.stream.JsonGenerator;

public class PrettyJson {

    private static JsonWriterFactory FACTORY_INSTANCE;

    public static String toString(final JsonStructure status) {

        final StringWriter stringWriter = new StringWriter();

        final JsonWriter jsonWriter = getPrettyJsonWriterFactory()
                .createWriter(stringWriter);

        jsonWriter.write(status);
        jsonWriter.close();

        return stringWriter.toString();
    }

    private static JsonWriterFactory getPrettyJsonWriterFactory() {
        if (null == FACTORY_INSTANCE) {
            final Map<String, Object> properties = new HashMap<>(1);
            properties.put(JsonGenerator.PRETTY_PRINTING, true);
            FACTORY_INSTANCE = Json.createWriterFactory(properties);
        }
        return FACTORY_INSTANCE;
    }

}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ham 5

您可以像下面这样使用 Gson

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(object);
Run Code Online (Sandbox Code Playgroud)

使用 Gson的帖子JSON 漂亮打印

或者,您可以像下面一样使用 Jackson

ObjectMapper mapper = new ObjectMapper();
String perttyStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)

来自Java 中的漂亮打印 JSON (Jackson)

希望这有帮助!