Хорошая печать JSON из ObjectMapper Джексона 2.2


144

Прямо сейчас у меня есть экземпляр, 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

Ответы:


283

Вы можете включить довольно-печать, установив SerializationFeature.INDENT_OUTPUTна ваш ObjectMapperвыглядеть примерно так:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
Я также пробовал это, но кажется, что SerializationConfigэто решено, но SerializationConfig.Featureэто не так. Кажется, это еще один метод красивой печати, который также устарел, если я чего-то не упускаю. Есть Featureкласс, который выделен сам по себе, но не имеет INDENT_OUTPUTвнутри константы. :(
Энтони Аткинсон

Превосходно! Я хотел бы знать, как вы это обнаружили;)
Энтони Аткинсон

1
Я посмотрел на один из моих проектов, но оказалось, что он тоже здесь: github.com/FasterXML/jackson-databind в разделе «Часто используемые функции»
gregwhitaker

Соответствующий необходимый импорт - 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

47

Согласно mkyong , волшебное заклинание - defaultPrintingWriterэто красиво напечатать JSON :

Более новые версии:

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

Старые версии:

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

Кажется, я чуть-чуть бросил пистолет. Вы можете попробовать gson , конструктор которого поддерживает красивую печать :

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

Надеюсь это поможет...


1
Я нашел эту статью и был разочарован, обнаружив, что это один из устаревших способов красивой печати. defaultPrettyPrintingWriter()больше не доступен (даже как устаревший метод) в ObjectMapperклассе.
Энтони Аткинсон

Я действительно думал об этом, но мое приложение уже сильно ориентировано на Джексона, и вся функциональность фактически завершена. Сервер веб-приложений, на котором он будет размещен, уже облагается довольно высокими налогами, и я не хотел бы загружать дополнительные библиотеки просто для регистрации запросов и ответов. Я определенно проголосую за ваш ответ.
Энтони Аткинсон

7
@AnthonyAtkinson в Jackson 2.3 есть методObjectMapper.writerWithDefaultPrettyPrinter()
matt b

37

API Джексона изменился:

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

3
Все еще возможно (с Джексоном 2.7.6) использовать new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. Вам просто нужно убедиться, что вы используете писатель, который вы получаете из настроенного ObjectMapper.
Мартин

3

IDENT_OUTPUT ничего не сделал для меня и дал полный ответ, который работает с моими банками jackson 2.2.3:

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

-8

Попробуй это.

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

14
Дублирование выбранного ответа через 7 месяцев бесполезно.
Игорь Родригес

1
может быть полезным для кого-то, как я уже упоминал в одной строке, я чувствую себя хорошо, когда делюсь тем, что знаю.
чувствую себя хорошо и программирование
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.