Java'da Pretty-Print JSON


217

kullanıyorum ve JSON verilerini güzelce yazdırmam gerekiyor (daha insan tarafından okunabilir hale getiriyorum).

Bu işlevselliği bu kitaplıkta bulamadım. Bu yaygın olarak nasıl elde edilir?

Yanıtlar:


285

GSON bunu güzel bir şekilde yapabilir:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(uglyJSONString);
String prettyJsonString = gson.toJson(je);

1
Peki bir JsonElement içine bir dize ayrıştırmak için kod dahil, genellikle zaten JSON verileri ile yaptığınız önceki işten var. Ama kullanımı daha net hale getirmek için buraya eklemek istedim.
Ray Hulha

Bu cevap bana yardımcı oldu. Ben bu ne arıyorsanız bu ifadeyi daha az satır küçültmek için aşağıdaki kodu ekledim. public String prettifyJson (String json) {JsonElement jsonElement = yeni JsonParser (). parse (json); yeni GsonBuilder () döndürün. setPrettyPrinting (). create (). toJson (jsonElement); }
ahmad

2
Rhino'ya gömülü JSON ayrıştırıcısına (JDK 1.7 ve üstü) erişebildiğiniz için OP'nin sorusunu ek kütüphanelere ihtiyaç duymadan cevaplamak mümkündür. Ben sadece bazı hata ayıklama çıktı biçimlendirmek için bir projeye bir kütüphane eklemek arzu olduğunu sanmıyorum. scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
Agnes

1
Org.json alternatifinin aksine, GSON'un güzel baskı şekli, dönüşümden sonra öğelerin sırasını değiştirmez.
Aydin K.

1
İşaretçi için teşekkürler GsonBuilder, çünkügson.toJson(object) sadece örnekleme için değiştirmek zorunda Gson gson = new Gson();kaldı Gson gson = new GsonBuilder().setPrettyPrinting().create(); ve kodum çalışmaya devam etti ama oldukça tek bir satır yerine nesneyi yazdırdı.
cptully

153

Kullandığım org.json verileri oldukça-yazdırmak için yerleşik yöntemlerin.

JSONObject json = new JSONObject(jsonString); // Convert text to object
System.out.println(json.toString(4)); // Print it with specified indentation

JSON'daki alanların sırası, tanım başına rastgele. Belirli bir sipariş ayrıştırıcı uygulamasına tabidir.


7
Bu çözümü de tercih ediyorum, çünkü diğer cevapların önerdiği gibi ek bağımlılıkları içe aktarmanız gerekmez.
gdrt

3
Önemli bir içe aktarma eksik - içe aktarma org.json.JSONObject;
MasterJoe2

Alanlar rastgele sırada DEĞİL var zaten, onları eklediğim sırada istiyorum?
Thomas Adrian

@ThomasAdrian org.json.JSONObject ile mümkün değildir.
Raghu Kiran

Alt çizgi-java, json'u biçimlendirirken öznitelik sırasını korur.
Valentyn Kolesnikov

37

GSON bunu destekliyor gibi görünüyor , ancak kullandığınız kütüphaneden geçmek isteyip istemediğinizi bilmiyorum.

Kullanıcı kılavuzundan:

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

4
GSON ile ilgili sorun, karmaşık, json-simple çok daha kolay.
mabuzer

1
Bir yılı aşkın bir süredir bu konuya bakmadım, ancak kaynak kodunu biraz değiştirmek istiyorsanız, code.google.com/p/json-simple/issues/detail?id=22 ilgili bazı bilgiler var güzel baskı ile json-simple geliştirme.
BuffaloBuffalo

Herhangi bir baskı formatı olmadan sadece dize var :(
Kiraz

Dize \ r \ n ile yazdırır
Stone Jack

Teşekkürler. bir satırda toString () geçersiz kılma: new GsonBuilder (). setPrettyPrinting (). create (). toJson (this);
KeepAtIt

30

Jackson ( com.fasterxml.jackson.databind) ile:

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject))

Gönderen: Güzel baskı JSON çıktısını etkinleştirme (Jackson)

Bunun zaten cevaplarda olduğunu biliyorum, ama burada ayrı ayrı yazmak istiyorum çünkü şans, zaten bir bağımlılık olarak Jackson var ve bu yüzden ihtiyacınız olacak ekstra bir kod satırı olurdu


21

JSON İşleme (JSR-353) uygulaması için bir Java API kullanıyorsanız, JsonGenerator.PRETTY_PRINTINGbirJsonGeneratorFactory .

Aşağıdaki örnek başlangıçta blog yayınımda yayınlandı .

import java.util.*;
import javax.json.Json;
import javax.json.stream.*;

Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JsonGenerator.PRETTY_PRINTING, true);
JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties);
JsonGenerator jg = jgf.createGenerator(System.out);

jg.writeStartObject()                    // {
    .write("name", "Jane Doe")           //    "name":"Jane Doe",
    .writeStartObject("address")         //    "address":{
        .write("type", 1)                //        "type":1,
        .write("street", "1 A Street")   //        "street":"1 A Street",
        .writeNull("city")               //        "city":null,
        .write("verified", false)        //        "verified":false
    .writeEnd()                          //    },
    .writeStartArray("phone-numbers")    //    "phone-numbers":[
        .writeStartObject()              //        {
            .write("number", "555-1111") //            "number":"555-1111",
            .write("extension", "123")   //            "extension":"123"
        .writeEnd()                      //        },
        .writeStartObject()              //        {
            .write("number", "555-2222") //            "number":"555-2222",
            .writeNull("extension")      //            "extension":null
        .writeEnd()                      //        }
    .writeEnd()                          //    ]
.writeEnd()                              // }
.close();

18

Benim durumum, benim proje güzel baskı desteklemeyen eski (JSR olmayan) bir JSON ayrıştırıcı kullanır. Ancak, oldukça basılı JSON örnekleri üretmek gerekiyordu; Java 7 ve sonraki sürümlerini kullandığınız sürece ekstra kitaplık eklemek zorunda kalmadan bu mümkündür:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine scriptEngine = manager.getEngineByName("JavaScript");
scriptEngine.put("jsonString", jsonStringNoWhitespace);
scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
String prettyPrintedJson = (String) scriptEngine.get("result");

3
Bu awsome, bunu yapmak için js motorunu kullanın, çok daha basit
med116

önemsiyorsanız uyarı: ScriptEngineManager API değildir.
18:38, nclark

18

GSON ile tek satırda güzel baskı :

System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(jsonString)));

Satırlamanın yanı sıra, bu kabul edilen cevaba eşdeğerdir .


8

Mevcut cevapların çoğu ya bir dış kütüphaneye bağlıdır ya da özel bir Java sürümü gerektirir. JSON dizesini sadece genel Java API'lerini kullanarak yazdırmak için basit bir kod (daha yüksek sürüm için Java 7'de mevcuttur; ancak eski sürümü denemedim).

Temel fikir, JSON'daki özel karakterlere dayalı biçimlendirmeyi kapmaktır. Örneğin, '{' veya '[' görülürse, kod yeni bir satır oluşturur ve girinti seviyesini artırır.

Feragatname: Bunu sadece bazı basit JSON vakaları (temel anahtar / değer çifti, liste, iç içe JSON) için test ettim, bu yüzden içindeki tırnaklarla dize değeri veya özel karakterler (\ n, \ t vs.).

/**
 * A simple implementation to pretty-print JSON file.
 *
 * @param unformattedJsonString
 * @return
 */
public static String prettyPrintJSON(String unformattedJsonString) {
  StringBuilder prettyJSONBuilder = new StringBuilder();
  int indentLevel = 0;
  boolean inQuote = false;
  for(char charFromUnformattedJson : unformattedJsonString.toCharArray()) {
    switch(charFromUnformattedJson) {
      case '"':
        // switch the quoting status
        inQuote = !inQuote;
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ' ':
        // For space: ignore the space if it is not being quoted.
        if(inQuote) {
          prettyJSONBuilder.append(charFromUnformattedJson);
        }
        break;
      case '{':
      case '[':
        // Starting a new block: increase the indent level
        prettyJSONBuilder.append(charFromUnformattedJson);
        indentLevel++;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        break;
      case '}':
      case ']':
        // Ending a new block; decrese the indent level
        indentLevel--;
        appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        prettyJSONBuilder.append(charFromUnformattedJson);
        break;
      case ',':
        // Ending a json item; create a new line after
        prettyJSONBuilder.append(charFromUnformattedJson);
        if(!inQuote) {
          appendIndentedNewLine(indentLevel, prettyJSONBuilder);
        }
        break;
      default:
        prettyJSONBuilder.append(charFromUnformattedJson);
    }
  }
  return prettyJSONBuilder.toString();
}

/**
 * Print a new line with indention at the beginning of the new line.
 * @param indentLevel
 * @param stringBuilder
 */
private static void appendIndentedNewLine(int indentLevel, StringBuilder stringBuilder) {
  stringBuilder.append("\n");
  for(int i = 0; i < indentLevel; i++) {
    // Assuming indention using 2 spaces
    stringBuilder.append("  ");
  }
}

İlk okumada bu öneriyle çok memnun kalmadım, ancak tüm cevapları okuduktan sonra, bu en iyi çözüm. En azından, sadece bazı hata ayıklama çıktıları içinse ve bağımlılıkları sürüklemek istemiyorsanız, daha sonra tekrar kaldırmak isteyebilirsiniz. Çok teşekkür ederim!
user2081279

7

Bir satırda:

String niceFormattedJson = JsonWriter.formatJson(jsonString)

Json-io libray ( https://github.com/jdereg/json-io ), JDK'dan başka bağımlılığı olmayan küçük (75K) bir kütüphanedir.

Güzel yazdırılan JSON'a ek olarak, Java nesnelerini (döngüler içeren tüm Java nesne grafiklerini) JSON'a serileştirebilir ve bunları okuyabilirsiniz.


7

Artık bu JSONLib kütüphanesi ile elde edilebilir:

http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONObject.html

Eğer toString(int indentationFactor)standart değil, aşırı yüklenmiş yöntemi kullanırsanız (ve sadece)toString() yöntemi .

Bunu API'nin aşağıdaki sürümünde doğruladım:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20140107</version>
</dependency>

3
Bu kütüphane soruyu cevaplamaya yardımcı olsa da , sorunun nasıl çalıştığına ilişkin bazı açıklamalarla sorunun nasıl uygulanabileceğine dair bir örnek eklemek daha iyi olacaktır .
Francesco Menzani

1
Tamam geri bildirim için teşekkürler. Hatırlamama rağmen, benim gibi insanlar gönüllüydü ve kalite standartlarını karşılamayı garanti eden bir hizmet sunmak için para almıyorlar. Sınırlı zamanımız var çünkü sık sık işin ortasındayız ya da aile görevlerimiz var. Bu nedenle "düzenle" okuyucular tarafından kullanılabilir, böylece birbirimizin yayınlarını daha yararlı hale getirebiliriz.
Sridhar Sarnobat

6

JSON-P 1.0 teknik özelliklerini ( JSR-353 ) takiben, belirli bir JsonStructure( JsonObjectveya JsonArray) için daha güncel bir çözüm şöyle görünebilir:

import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import javax.json.Json;
import javax.json.JsonStructure;
import javax.json.JsonWriter;
import javax.json.JsonWriterFactory;
import javax.json.stream.JsonGenerator;

public class PrettyJson {

    private static JsonWriterFactory FACTORY_INSTANCE;

    public static String toString(final JsonStructure status) {

        final StringWriter stringWriter = new StringWriter();

        final JsonWriter jsonWriter = getPrettyJsonWriterFactory()
                .createWriter(stringWriter);

        jsonWriter.write(status);
        jsonWriter.close();

        return stringWriter.toString();
    }

    private static JsonWriterFactory getPrettyJsonWriterFactory() {
        if (null == FACTORY_INSTANCE) {
            final Map<String, Object> properties = new HashMap<>(1);
            properties.put(JsonGenerator.PRETTY_PRINTING, true);
            FACTORY_INSTANCE = Json.createWriterFactory(properties);
        }
        return FACTORY_INSTANCE;
    }

}


5

Gson'u aşağıdaki gibi kullanabilirsiniz

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(object);

Sonrası itibaren JSON oldukça GSON kullanarak yazdırmak

Alternatif olarak, Jackson'ı aşağıdaki gibi kullanabilirsiniz

ObjectMapper mapper = new ObjectMapper();
String perttyStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);

Görevinden Pretty Java JSON (Jackson) yazdırmak

Umarım bu yardım!


4

Org json kullanma. Referans bağlantısı

JSONObject jsonObject = new JSONObject(obj);
String prettyJson = jsonObject.toString(4);

Gson kullanma. Referans bağlantısı

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(obj);

Jackson kullanarak. Referans bağlantısı

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

Genson kullanarak. Referans bağlantısı .

Genson prettyGenson = new GensonBuilder().useIndentation(true).create();
String prettyJson = prettyGenson.serialize(obj);

1

Bu benim için çalıştı, Jackson'ı kullanarak:

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)

Bu nereden mappergeldi?
Sertage

0

Küçük json kütüphanesini kullanabilirsiniz

String jsonstring = ....;
JsonValue json = JsonParser.parse(jsonstring);
String jsonIndendedByTwoSpaces = json.toPrettyString("  ");

-2

Alt çizgi-java statik bir yönteme sahiptir U.formatJson(json). Beş format türü desteklenir: 2, 3, 4, sekme ve kompakt. Ben projenin koruyucusuyum. Canlı örnek

import com.github.underscore.lodash.U;

import static com.github.underscore.lodash.Json.JsonStringBuilder.Step.TABS;
import static com.github.underscore.lodash.Json.JsonStringBuilder.Step.TWO_SPACES;

public class MyClass {

    public static void main(String args[]) {
        String json = "{\"Price\": {"
        + "    \"LineItems\": {"
        + "        \"LineItem\": {"
        + "            \"UnitOfMeasure\": \"EACH\", \"Quantity\": 2, \"ItemID\": \"ItemID\""
        + "        }"
        + "    },"
        + "    \"Currency\": \"USD\","
        + "    \"EnterpriseCode\": \"EnterpriseCode\""
        + "}}";
        System.out.println(U.formatJson(json, TWO_SPACES)); 
        System.out.println(U.formatJson(json, TABS)); 
    }
}

Çıktı:

{
  "Price": {
    "LineItems": {
      "LineItem": {
        "UnitOfMeasure": "EACH",
        "Quantity": 2,
        "ItemID": "ItemID"
      }
    },
    "Currency": "USD",
    "EnterpriseCode": "EnterpriseCode"
  }
}
{
    "Price": {
        "LineItems": {
            "LineItem": {
                "UnitOfMeasure": "EACH",
                "Quantity": 2,
                "ItemID": "ItemID"
            }
        },
        "Currency": "USD",
        "EnterpriseCode": "EnterpriseCode"
    }
}    
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.