Soru Tostring () için JSON çıktısını varsayılan olarak kullanmak için Tamam?


@Override 
public String toString() { 
    return new Gson().toJson(this);
}

Bazı iyi uygulamaları kırıyor muyum? "Joshua" -pattern model nesneleri için bunu varsayılan davranış olarak yaparak şey, genel tasarım deseni veya başka bir sözleşme?

toString() Her halükarda sadece şu anda kullandığımız paradigmada (Android) hata ayıklamada kullanılacaktır. Aynı zamanda, JSON'ta nesneyi görmeyi sevmemin sebebi de bu yüzden, http / php / python-> mysql ve yerel SQLite ile ORM / json sürekliliğinin devam etmesi olacaktır.


32
2018-05-13 17:39


Menşei


Hiçbir şey kırmıyorsun. toString() Herhangi bir String'i döndürebilir (ancak, örneğin, içteki durum değişmediği sürece, aynı örnekte her çağrıldığında aynı Dizeyi döndürmesi gerekir). - Sotirios Delimanolis
@SotiriosDelimanolis: örneğin iç durumu değişmezse. - JB Nizet
@JBNizet Evet, bunu kelimelerle yazmalıyım (yani yorumunuzu yorumlamanız gerekir). - Sotirios Delimanolis
@tortal Genel olarak konuşuyordum. Tabi ki, Gson bunu yapacak. - Sotirios Delimanolis
Izlemek için birkaç olası sorunlar vardır - talep üzerine pahalı yükler koleksiyonları (performans), çift yönlü referanslar (sonsuz döngü), büyük nesne ağacının kök nesnesi (hata ayıklama ifadesinde tüm veritabanı) ve benzeri. Genel durumda genel olarak &String () temelli yansıma yapmamamın nedeni budur. Ancak böyle bir senaryo geçerli olsa da emin değil. - Michal


Cevaplar:


Evet. ToString () yöntemini uygulamak için GSON / Jackson / Reflections kütüphanesini kullanmanız uygun değildir.

ToString yöntemini uygulamanın birkaç yolu vardır.

  1. Yansımalar (Apache kütüphanesi)

    @Override
    public String toString(){
        return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
    }
    
  2. JSON tabanlı uygulama (GSON, Jackson kütüphaneleri)

    // GSON library for JSON
    @Override
    public String toString(){
        return new com.google.gson.Gson().toJson(this);
    }
    
    // Jackson libabry for JSON/YAML
    @Override
    public String toString() {
        try {
            return new com.fasterxml.jackson.databind.ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (com.fasterxml.jackson.core.JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
    
  3. ToStringBuilder (apache-commons kütüphanesi ile kullanılabilir)

    @Override
    public String toString() {
        return new org.apache.commons.lang3.builder.ToStringBuilder(this).
            append("field1", field1).
            append("field2", field2).
            toString();
    }
    
  4. Sert çekirdekli toString () uygulaması

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    

45
2017-08-22 22:29



İnanılmaz cevap, çeşitli seçenekler ve birkaç satırda çok ayrıntılı. Bu kabul edilen kişi olmalı. - maaw
Cevap sözleşmesi tartışılarak geliştirilebilir toString ve bir JSON serileştirme işleminin bu sözleşmeyi karşılayıp karşılamadığını (bence bunu yapar) ve herhangi bir potansiyel downsides (performans?, ancak sözleşme ile azaltılmış - yöntem, hata ayıklama / görüntüleme içindir, bu nedenle performans göstermesi beklenmez) - Rich


Bu şekilde yapmanın bir zararı yok. Sizin için statik bir değişken oluşturmanızı öneririm Gson örneği ve güzel baskıyı etkinleştirin:

static Gson gson = new GsonBuilder().setPrettyPrinting().create();

Bu şekilde çıktı toString yöntem biçimlendirilecektir.


7
2018-04-27 15:26



Neden yeni GsonBuilder (). SetPrettyPrinting (). Neden sadece "yeni Gson ()" değil? - Biscuit Coder
Ben biraz googling sonra var. Bunu önce yapmalıydım. Güzel baskı kullanmak oldukça faydalı olacaktır - Biscuit Coder


NOT: Eğer bu GSon'u toString () yönteminizde güzel bir şekilde kullanırsanız, hata ayıklayıcınızdaki çöp gibi görünecektir, çünkü yeni satırlarla dolu olacaktır.

(Üzgünüz, yukarıda yorum yazmak için yeterince yetkili yok)


3
2017-11-07 03:48



Hangi hata ayıklayıcısını kullandığınızdan emin değilsiniz, ancak IntelliJ ve muhtemelen diğer IDE'ler yeni satırlarda toString() çıktı. - Rich


Performans açısından kötü çünkü Gson, hangi alanların yazdırılacağını anlamak için iç gözlemi kullanıyor.

Bunun dışında, bence sorun değil. Bu, standart Java toString uygulaması değil ama değiştirmenin bir anti-pattern olacağını düşünmüyorum.


0
2017-08-26 13:17



Cevabınız çok yararlı olmayan "Bence" dışında bir kanıt ya da argüman sunmuyor :-( - Rich