kullanıyorum json-basit 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?
kullanıyorum json-basit 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:
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);
scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
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ı.
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.
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);
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
JSON İşleme (JSR-353) uygulaması için bir Java API kullanıyorsanız, JsonGenerator.PRETTY_PRINTING
birJsonGeneratorFactory
.
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();
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");
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 .
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(" ");
}
}
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.
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>
JSON-P 1.0 teknik özelliklerini ( JSR-353 ) takiben, belirli bir JsonStructure
( JsonObject
veya 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;
}
}
JSONLib'de bunu kullanabilirsiniz:
String jsonTxt = JSONUtils.valueToString(json, 8, 4);
Gönderen Javadoc :
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!
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);
Bu benim için çalıştı, Jackson'ı kullanarak:
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)
mapper
geldi?
Küçük json kütüphanesini kullanabilirsiniz
String jsonstring = ....;
JsonValue json = JsonParser.parse(jsonstring);
String jsonIndendedByTwoSpaces = json.toPrettyString(" ");
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"
}
}