Jackson 2.2의 ObjectMapper에서 JSON 인쇄하기


141

지금은 인스턴스가 org.fasterxml.jackson.databind.ObjectMapper있으며 String예쁜 JSON 을 원합니다 . 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

답변:


277

SerializationFeature.INDENT_OUTPUT다음 ObjectMapper과 같이 설정하여 예쁘게 인쇄 할 수 있습니다 .

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
나는 또한 이것을 시도했지만 SerializationConfig해결 된 것처럼 보이지만 SerializationConfig.Feature그렇지 않습니다. 이것은 내가 뭔가를 놓치지 않으면 더 이상 사용되지 않는 예쁜 인쇄의 또 다른 방법 인 것 같습니다. 거기에있다 Feature의 자체 밖으로 분리하는 것이 클래스는하지만이없는 INDENT_OUTPUT일정한 내부. :(
Anthony Atkinson

우수한! 나는 당신이 어떻게 그것을 발견했는지 알고 싶습니다;)
Anthony Atkinson

1
내 프로젝트 중 하나를 보았지만 여기에도 있습니다. "일반적으로 사용되는 기능"아래
github.com/FasterXML/jackson-databind

필요한 가져 오기는 import com.fasterxml.jackson.databind입니다. {SerializationFeature, ObjectMapper}
dgh

2
2.2.1에서는 이것이 나에게 필요한 것입니다 : import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
harschware

46

mkyong 에 따르면 , 마법의 주문은 JSONdefaultPrintingWriter예쁘게 인쇄하는 것입니다 .

최신 버전 :

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

이전 버전 :

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

총을 빨리 뛴 것 같습니다. 생성자가 pretty-printing을 지원 하는 gson을 시도 할 수 있습니다 .

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

도움이 되었기를 바랍니다...


1
나는이 기사를 찾았고 이것이 더 이상 사용되지 않는 예쁜 인쇄 방법 중 하나라는 사실에 실망했습니다. defaultPrettyPrintingWriter()더 이상 ObjectMapper클래스 에서 더 이상 사용할 수 없습니다 (더 이상 사용되지 않는 방법으로도) .
Anthony Atkinson

실제로이 작업을 생각하고 있었지만 응용 프로그램은 이미 Jackson 중심이며 모든 기능이 실제로 완료되었습니다. 이것이 호스팅 될 웹 응용 프로그램 서버는 이미 상당히 과세되어 있으며 요청 및 응답을 로깅하기 위해 추가 라이브러리를로드하고 싶지 않습니다. 그래도 나는 당신의 대답을 확실히 투표 할 것입니다.
Anthony Atkinson

7
Jackson 2.3의 @AnthonyAtkinson 방법이 있습니다ObjectMapper.writerWithDefaultPrettyPrinter()
matt b

36

jackson API가 변경되었습니다.

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

3
Jackson Jackson 2.7.6에서는 여전히을 사용할 수 있습니다 new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. 당신은 당신이 구성에서 얻을 라이터를 사용해야합니다 ObjectMapper.
Martin

3

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 ) );
}

0

프로세스의 모든 ObjectMapper 인스턴스에 대해 기본적으로 이것을 켜려면, INDENT_OUTPUT의 기본값을 true로 설정하는 약간의 해킹이 있습니다.

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

0

스프링과 잭슨 조합을 사용하는 경우 다음과 같이 할 수 있습니다. 제안 된대로 @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>

0

이 질문을보고 다른 사람은 (아닌 객체) 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();
} 

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.