Jackson kullanarak JSON String Pretty Print JSON çıktı dönüştürme


165

Bu sahip olduğum JSON dizesi:

{"attributes":[{"nm":"ACCOUNT","lv":[{"v":{"Id":null,"State":null},"vt":"java.util.Map","cn":1}],"vt":"java.util.Map","status":"SUCCESS","lmd":13585},{"nm":"PROFILE","lv":[{"v":{"Party":null,"Ads":null},"vt":"java.util.Map","cn":2}],"vt":"java.util.Map","status":"SUCCESS","lmd":41962}]}

Yukarıdaki JSON Stringaşağıdaki gibi Pretty Print JSON Çıkışı (Jackson kullanarak) dönüştürmek gerekir :

{
    "attributes": [
        {
            "nm": "ACCOUNT",
            "lv": [
                {
                    "v": {
                        "Id": null,
                        "State": null
                    },
                    "vt": "java.util.Map",
                    "cn": 1
                }
            ],
            "vt": "java.util.Map",
            "status": "SUCCESS",
            "lmd": 13585
        },
        {
            "nm": "PROFILE
            "lv": [
                {
                    "v": {
                        "Party": null,
                        "Ads": null
                    },
                    "vt": "java.util.Map",
                    "cn": 2
                }
            ],
            "vt": "java.util.Map",
            "status": "SUCCESS",
            "lmd": 41962
        }
    ]
}

Yukarıdaki örneğime dayanarak bana bir örnek verebilir misiniz? Bu senaryo nasıl elde edilir? Çok fazla örnek olduğunu biliyorum, ama bunları tam olarak anlayamıyorum. Herhangi bir yardım basit bir örnekle takdir edilecektir.

Güncellenmiş:

Aşağıda kullanıyorum kodu:

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonString));

Ancak bu, yukarıda belirtildiği gibi çıktıya ihtiyaç duyduğum şekilde çalışmaz.

Yukarıdaki JSON için kullanıyorum POJO İşte:

public class UrlInfo implements Serializable {

    private List<Attributes> attribute;

}

class Attributes {

    private String nm;
    private List<ValueList> lv;
    private String vt;
    private String status;
    private String lmd;

}


class ValueList {
    private String vt;
    private String cn;
    private List<String> v;
}

Herkes bana JSON için doğru POJO olup olmadığını söyleyebilir?

Güncellenmiş:

String result = restTemplate.getForObject(url.toString(), String.class);

ObjectMapper mapper = new ObjectMapper();
Object json = mapper.readValue(result, Object.class);

String indented = mapper.defaultPrettyPrintingWriter().writeValueAsString(json);

System.out.println(indented);//This print statement show correct way I need

model.addAttribute("response", (indented));

Aşağıdaki satır böyle bir şey yazdırır:

System.out.println(indented);


{
  "attributes" : [ {
    "nm" : "ACCOUNT",
    "error" : "null SYS00019CancellationException in CoreImpl fetchAttributes\n java.util.concurrent.CancellationException\n\tat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)\n\tat java.util.concurrent.FutureTask.",
    "status" : "ERROR"
  } ]
}

bu şekilde gösterilmem gerekiyordu. Ama böyle bir modele eklediğimde:

model.addAttribute("response", (indented));

Ve sonra aşağıdaki gibi bir sonuç formu jsp sayfasında gösterir:

    <fieldset>
        <legend>Response:</legend>
            <strong>${response}</strong><br />

    </fieldset>

Böyle bir şey alıyorum:

{ "attributes" : [ { "nm" : "ACCOUNT", "error" : "null    
SYS00019CancellationException in CoreImpl fetchAttributes\n 
java.util.concurrent.CancellationException\n\tat 
java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:231)\n\tat 
java.util.concurrent.FutureTask.", "status" : "ERROR" } ] }

ki buna ihtiyacım yok. Yukarıda yazdırılma şekline ihtiyacım vardı. Biri bana bunun neden böyle olduğunu söyleyebilir mi?

Yanıtlar:


252

Herhangi bir eski JSON'u girintilemek için aşağıdaki gibi bağlayın Object:

Object json = mapper.readValue(input, Object.class);

ve sonra girinti ile yazınız:

String indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);

bu, verileri eşlemek için gerçek POJO tanımlamanıza engel olur.

Veya JsonNode(JSON Tree) 'yi de kullanabilirsiniz.


Teşekkürler StaxMan, sanırım bu işe yarıyor. Girintili çıktı aldığımda ihtiyacım olan şekilde olurum. Ama Modelde eklemek için girintili kullandığımda sonuç formu sayfasında gösterebilirim. Hala iki üç satıra yazdırılıyor. Soruyu güncelledim, belki şu anda neler olduğu hakkında daha fazla fikir edineceksiniz.
cephanelik

Sorun Bahar o zaman - sanırım bir POJO özniteliği olarak değil, önceden biçimlendirilmiş bir String bekliyor. Dolayısıyla, kendiniz biçimlendirmeye çalışmak yerine, Spring'e bunu yapmasını söylemeniz gerekir. Jackson'ı kullanırken, girintiyi kullanacak şekilde yapılandırmak mümkün olmalıdır. Dürüst olmakla birlikte, yanıt için neden girintiye bile girmeniz gerektiğinden emin değilim.
StaxMan

30
Merhaba, defaultPrettyPrintingWriter () kullanımdan kaldırıldı. 1.9'dan beri, bunun yerine writerWithDefaultPrettyPrinter () kullanın. Bakınız: jackson.codehaus.org/1.9.0/javadoc/org/codehaus/jackson/map/…
Browny Lin

6
Jackson 2 için, aşağıda Marcelo C. tarafından belirtildiği gibi SerializationFeature.INDENT_OUTPUT kullanın
Mike R

nasıl jackson kullanarak yazılı değer miktarı yayınlamak için herhangi bir fikir?
Reyansh Mishra

125

En basit ve aynı zamanda en kompakt çözüm (v2.3.3 için):

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.writeValueAsString(obj)

21
Aslında bunu daha da kısaltabilirsiniz: ObjectMapper mapper = new ObjectMapper.enable (SerializationFeature.INDENT_OUTPUT);
Jason Nichols

26

Jackson 1.9+ kullanmanın yeni yolu şudur:

Object json = OBJECT_MAPPER.readValue(diffResponseJson, Object.class);
String indented = OBJECT_MAPPER.writerWithDefaultPrettyPrinter()
                               .writeValueAsString(json);

Çıktı doğru biçimlendirilecek!


1
Ne yazık ki, bu girdi başka bir json değil, çalışma zamanı oluşturulan bir nesne ise yardımcı olmaz.
Innokenty

@Innokenty Sonra ilk satırı atlayın.
muttonUp

2
Evet, tabii ki. Ben bile yaptım, neden böyle aptal bir yorum bıraktım bilmiyorum =)
Innokenty

17

Jackson 1.9 için, güzel baskı için aşağıdaki kodu kullanabiliriz.

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

11

Bence, bu json verilerini güzelleştirmek için en basit teknik,

String indented = (new JSONObject(Response)).toString(4);

burada Yanıt bir Dizedir.

Sadece 4 (indentSpaces) toString()yöntemini iletin .

Not: Herhangi bir kütüphane olmadan android iyi çalışır. Ancak java'da org.json kütüphanesini kullanmanız gerekir .


3
Bu kayda değer Java (org.json) kitaplığında JSON kullanıyor .
Steve Chambers

Android, herhangi bir kütüphaneci olmadan direclty kullanabilirsiniz.
Aman Gupta - ShOoTeR

String json = new GsonBuilder().setPrettyPrinting().create().toJson(map); String indentedJson = (new JSONObject(json)).toString(4);nedense ikincisi anahtarların sırasını kaybediyor
Michail Michailidis

Mevcut yaklaşım maalesef json nesnelerinin listesini işlemez. Yani [{"id": "1"}, {"id": "2"}]
Geniy

4

Bu, sorunuzun cevabı olabilir gibi görünüyor . Bahar kullandığını söylüyor, ama bence bu senin durumunda hala yardımcı olacak. Buradaki kodu satır içi yapmama izin verin, böylece daha rahat:

import java.io.FileReader;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    MyClass myObject = mapper.readValue(new FileReader("input.json"), MyClass.class);
    // this is Jackson 1.x API only: 
    ObjectWriter writer = mapper.defaultPrettyPrintingWriter();
    // ***IMPORTANT!!!*** for Jackson 2.x use the line below instead of the one above: 
    // ObjectWriter writer = mapper.writer().withDefaultPrettyPrinter();
    System.out.println(writer.writeValueAsString(myObject));
  }
}

class MyClass
{
  String one;
  String[] two;
  MyOtherClass three;

  public String getOne() {return one;}
  void setOne(String one) {this.one = one;}
  public String[] getTwo() {return two;}
  void setTwo(String[] two) {this.two = two;}
  public MyOtherClass getThree() {return three;}
  void setThree(MyOtherClass three) {this.three = three;}
}

class MyOtherClass
{
  String four;
  String[] five;

  public String getFour() {return four;}
  void setFour(String four) {this.four = four;}
  public String[] getFive() {return five;}
  void setFive(String[] five) {this.five = five;}
}

Yardım için teşekkürler Daniel. Sahip olduğum en zor kısım JSON'umu bir sınıfa nasıl modellemek? Eğer o parçayı çalıştırırsam, geri kalanını kolayca kodlayabilirim.
cephanelik

JSON'dan yazdığım POJO sınıfıma bir göz atabilir misiniz? Doğru görünüyor mu değil mi?
arsenal

3

Bunu aşağıdaki yollarla yapabilirsiniz:

1. Apache'den Jackson kullanma

    String formattedData=new ObjectMapper().writerWithDefaultPrettyPrinter()
.writeValueAsString(YOUR_JSON_OBJECT);

Körük sınıfını içe aktar:

import com.fasterxml.jackson.databind.ObjectMapper;

Gradle bağımlılığı:

compile 'com.fasterxml.jackson.core:jackson-core:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.3'

2. Google'dan Gson kullanma

String formattedData=new GsonBuilder().setPrettyPrinting()
    .create().toJson(YOUR_OBJECT);

Körük sınıfını içe aktar:

import com.google.gson.Gson;

Derecesi:

compile 'com.google.code.gson:gson:2.8.2'

Burada, doğru güncellenmiş sürümü depodan indirebilirsiniz.


2

ObjectMapper.readTree() bunu tek bir satırda yapabilirsiniz:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(mapper.readTree(json));

1
Bu yanıtı sevmemin nedeni, JSON türlerine doğrudan eşleme dışında herhangi bir nesne dönüşümü yapmamasıdır. Giriş dizesi geçerli JSON olduğu sürece, çıkış dizesinin semantik olarak eşdeğer JSON olacağını biliyoruz.
M Justin
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.