【问题标题】:Pretty printing JSON from Jackson 2.2's ObjectMapper来自 Jackson 2.2 的 ObjectMapper 的漂亮打印 JSON
【发布时间】:2013-07-11 03:23:15
【问题描述】:

现在我有一个org.fasterxml.jackson.databind.ObjectMapper 的实例,并希望得到一个带有漂亮JSON 的String。我的 Google 搜索的所有结果都提出了 Jackson 1.x 执行此操作的方法,而我似乎无法找到正确的、未弃用的 2.2 执行此操作的方法。尽管我不认为代码对于这个问题是绝对必要的,但这是我现在所拥有的:

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
System.out.println("\n\n----------REQUEST-----------");
StringWriter sw = new StringWriter();
mapper.writeValue(sw, jsonObject);
// Want pretty version of sw.toString() here

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您可以通过在ObjectMapper 上设置SerializationFeature.INDENT_OUTPUT 来启用漂亮打印,如下所示:

    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    

    【讨论】:

    • 我也试过这个,但似乎SerializationConfig 已解决但SerializationConfig.Feature 未解决。这似乎是另一种漂亮的打印方法,除非我遗漏了什么,否则它也已被弃用。有一个 Feature 类独立出来,但内部没有 INDENT_OUTPUT 常量。 :(
    • 太棒了!我很想知道你是怎么发现的 ;)
    • 我查看了我的一个项目,但它似乎也在这里:github.com/FasterXML/jackson-databind 在“常用功能”下
    • 需要的相关导入是 import com.fasterxml.jackson.databind.{SerializationFeature, ObjectMapper}
    • 在 2.2.1 上,这对我来说是这样的:import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable(Feature.INDENT_OUTPUT);
    【解决方案2】:

    根据mkyong,魔法咒语是defaultPrintingWriterpretty print JSON

    较新的版本:

    System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance));
    

    旧版本:

    System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance));
    

    看来我有点急了。你可以试试gson,他的constructor supports pretty-printing

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String jsonOutput = gson.toJson(someObject);
    

    希望这会有所帮助...

    【讨论】:

    • 我找到了这篇文章,但很失望地发现这是一种已被弃用的漂亮打印方式。 defaultPrettyPrintingWriter()ObjectMapper 类上不再可用(即使作为已弃用的方法)。
    • 我实际上正在考虑这样做,但我的应用程序已经严重面向 Jackson 并且所有功能实际上都已完成。将托管它的 Web 应用程序服务器已经被征得相当重的税,我不想仅仅为了记录请求和响应而加载额外的库。不过,我肯定会投票赞成你的答案。
    • @AnthonyAtkinson 在 Jackson 2.3 中有一个方法 ObjectMapper.writerWithDefaultPrettyPrinter()
    【解决方案3】:

    jackson API 已更改:

    new ObjectMapper()
    .writer()
    .withDefaultPrettyPrinter()
    .writeValueAsString(new HashMap<String, Object>());
    

    【讨论】:

    • 仍然可以(使用 Jackson 2.7.6)使用new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap&lt;String, Object&gt;());。您只需要确保使用从配置的ObjectMapper 获得的编写器。
    【解决方案4】:

    IDENT_OUTPUT 没有为我做任何事情,并给出一个适用于我的 jackson 2.2.3 jar 的完整答案:

    public static void main(String[] args) throws IOException {
    
    byte[] jsonBytes = Files.readAllBytes(Paths.get("C:\\data\\testfiles\\single-line.json"));
    
    ObjectMapper objectMapper = new ObjectMapper();
    
    Object json = objectMapper.readValue( jsonBytes, Object.class );
    
    System.out.println( objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( json ) );
    }
    

    【讨论】:

      【解决方案5】:

      如果您想为进程中的所有 ObjectMapper 实例默认启用此功能,这里有一个小技巧,可以将 INDENT_OUTPUT 的默认值设置为 true:

      val indentOutput = SerializationFeature.INDENT_OUTPUT
      val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState")
      defaultStateField.setAccessible(true)
      defaultStateField.set(indentOutput, true)
      

      【讨论】:

        【解决方案6】:

        如果您使用的是 spring 和 jackson 组合,您可以按照以下方式进行操作。我按照建议关注@gregwhitaker,但以春季风格实施。

        <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
            <property name="dateFormat">
                <bean class="java.text.SimpleDateFormat">
                    <constructor-arg value="yyyy-MM-dd" />
                    <property name="lenient" value="false" />
                </bean>
            </property>
            <property name="serializationInclusion">
                <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">
                    NON_NULL
                </value>
            </property>
        </bean>
        
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetObject">
                <ref bean="objectMapper" />
            </property>
            <property name="targetMethod">
                <value>enable</value>
            </property>
            <property name="arguments">
                <value type="com.fasterxml.jackson.databind.SerializationFeature">
                    INDENT_OUTPUT
                </value>
            </property>
        </bean>
        

        【讨论】:

          【解决方案7】:

          如果查看此问题的其他人只有一个 JSON 字符串(不在对象中),那么您可以将其放入 HashMap 并仍然让 ObjectMapper 工作。 result 变量是您的 JSON 字符串。

          import com.fasterxml.jackson.core.JsonParseException;
          import com.fasterxml.jackson.databind.JsonMappingException;
          import com.fasterxml.jackson.databind.ObjectMapper;
          import java.util.HashMap;
          import java.util.Map;
          
          // Pretty-print the JSON result
          try {
              ObjectMapper objectMapper = new ObjectMapper();
              Map<String, Object> response = objectMapper.readValue(result, HashMap.class);
              System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response));
          } catch (JsonParseException e) {
              e.printStackTrace();
          } catch (JsonMappingException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          } 
          

          【讨论】:

            【解决方案8】:

            试试这个。

             objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
            

            【讨论】:

            • 在 7 个月后复制所选答案并没有真正的帮助。
            • 可能对我在一行中提到的某些人有所帮助,我很乐意分享我所知道的一切。
            猜你喜欢
            • 2014-05-19
            • 1970-01-01
            • 2013-08-08
            • 2021-01-31
            • 2014-05-12
            • 2017-11-03
            • 2011-05-05
            • 2017-05-01
            相关资源
            最近更新 更多