Прямо сейчас у меня есть экземпляр, 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
SerializationConfig
это решено, ноSerializationConfig.Feature
это не так. Кажется, это еще один метод красивой печати, который также устарел, если я чего-то не упускаю. ЕстьFeature
класс, который выделен сам по себе, но не имеетINDENT_OUTPUT
внутри константы. :(Согласно mkyong , волшебное заклинание -
defaultPrintingWriter
это красиво напечатать JSON :Более новые версии:
Старые версии:
Кажется, я чуть-чуть бросил пистолет. Вы можете попробовать gson , конструктор которого поддерживает красивую печать :
Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonOutput = gson.toJson(someObject);
Надеюсь это поможет...
источник
defaultPrettyPrintingWriter()
больше не доступен (даже как устаревший метод) вObjectMapper
классе.ObjectMapper.writerWithDefaultPrettyPrinter()
API Джексона изменился:
new ObjectMapper() .writer() .withDefaultPrettyPrinter() .writeValueAsString(new HashMap<String, Object>());
источник
new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());
. Вам просто нужно убедиться, что вы используете писатель, который вы получаете из настроенногоObjectMapper
.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 ) ); }
источник
Если вы хотите включить это по умолчанию для ВСЕХ экземпляров ObjectMapper в процессе, вот небольшой прием, который установит для значения по умолчанию INDENT_OUTPUT значение true:
val indentOutput = SerializationFeature.INDENT_OUTPUT val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState") defaultStateField.setAccessible(true) defaultStateField.set(indentOutput, true)
источник
если вы используете комбинацию пружины и Джексона, вы можете сделать это следующим образом. Я следую предложению @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>
источник
Если у других, кто просматривает этот вопрос, есть только строка 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(); }
источник
Попробуй это.
источник