Jackson 2.2'nin ObjectMapper'inden güzel baskı JSON


141

Şu anda bir örneğim var org.fasterxml.jackson.databind.ObjectMapperve Stringgüzel JSON ile bir almak istiyorum . Google aramalarımın tüm sonuçları, bunu yapmanın Jackson 1.x yollarını buldu ve 2.2 ile bunu yapmanın uygun, onaylanmamış bir yolunu bulamıyorum. Kodun bu soru için kesinlikle gerekli olduğuna inanmama rağmen, şu anda sahip olduğum şey:

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

Yanıtlar:


277

Sen ayarlayarak oldukça yazdırma etkinleştirebilirsiniz SerializationFeature.INDENT_OUTPUTsenin üzerinde ObjectMappergibi pek:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
Ben de bunu denedim ama SerializationConfigçözülmüş ama SerializationConfig.Featuredeğil gibi görünüyor . Bu, bir şey kaçırmadıkça, kullanımdan kaldırılan başka bir güzel baskı yöntemi gibi görünüyor. FeatureKendi başına ayrılmış, ancak INDENT_OUTPUTiçinde sabit olmayan bir sınıf var . :(
Anthony Atkinson

Mükemmel! Bunu nasıl bulduğunu bilmek isterim;)
Anthony Atkinson

1
: Ben projelerinden biri baktı, ancak o da burada görünür github.com/FasterXML/jackson-databind "Yaygın olarak kullanılan Özellikleri" altında
gregwhitaker

Gereken ilgili içe aktarma import com.fasterxml.jackson.databind şeklindedir. {SerializationFeature, ObjectMapper}
dgh

2
2.2.1'de benim için gereken buydu: import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
harschware

46

Göre mkyong , sihirli büyü olduğunu defaultPrintingWriteriçin oldukça JSON yazdırmak :

Daha yeni sürümler:

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

Eski versiyonlar:

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

Silahı biraz çabuk atladım. Sen deneyebilirsiniz GSON kimin, yapıcı oldukça-baskı destekler :

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

Bu yardımcı olur umarım...


1
Bu makaleyi buldum ve bunun güzel baskıların kullanımdan kaldırılmış yollarından biri olduğunu hayal kırıklığına uğrattım. sınıfta defaultPrettyPrintingWriter()artık kullanılmıyor (kullanımdan kaldırılmış bir yöntem olarak bile) ObjectMapper.
Anthony Atkinson

Aslında bunu yapmayı düşünüyordum, ancak uygulamam zaten Jackson yönelimli ve tüm işlevsellik aslında tamamlandı. Bu barındırılacak web uygulama sunucusu zaten oldukça ağır vergilendiriliyor ve ben sadece istekleri ve yanıtları günlüğe kaydetmek için ekstra kütüphaneler yüklemek istemem. Yine de cevabınızı kesinlikle oylayacağım.
Anthony Atkinson

7
Jackson 2.3'te Anthony Watson, bir yöntem varObjectMapper.writerWithDefaultPrettyPrinter()
matt b

36

Jackson API değişti:

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

3
Kullanmak hala (Jackson 2.7.6 ile) mümkündür new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. Yapılandırmadan aldığınız yazıcıyı kullandığınızdan emin olmanız yeterlidir ObjectMapper.
Martin

3

IDENT_OUTPUT benim için hiçbir şey yapmadı ve jackson 2.2.3 kavanozlarım ile çalışan tam bir cevap vermek için:

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

Bir işlemdeki TÜM ObjectMapper örnekleri için bunu varsayılan olarak açmak isterseniz, INDENT_OUTPUT varsayılan değerini true olarak ayarlayacak küçük bir saldırı:

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

0

Eğer yay ve jackson kombinasyonu kullanıyorsanız, bunu aşağıdaki gibi yapabilirsiniz. @Gregwhitaker'ı önerildiği gibi takip ediyorum ama bahar tarzında uyguluyorum.

<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

Bu soruyu görüntüleyen diğer kullanıcıların yalnızca bir nesnede değil bir JSON dizesi varsa, o zaman bunu bir içine koyabilir HashMapve yine ObjectMapperde işe alabilirsiniz . resultDeğişken JSON dizedir.

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

Bunu dene.

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

13
Seçilen cevabı 7 ay sonra tekrarlamak gerçekten yararlı değildir.
Igor Rodriguez

1
bir satırda bahsettiğim gibi bazıları için yararlı olabilir, ben biliyorum ne olursa olsun paylaşımı iyi hissediyorum.
iyi hissediyorum ve
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.