2010-05-19 13 views
19

Kısacası, bu JAVA'da ayrıştırmak istediğim JSON nesnesinin bir taslağıdır:JSON'u düzgün bir şekilde serileştirmek için Google'ın Gson API'sını nasıl kullanırım?

{ 
    object1: { 
      item1: //[String | Array | Object] , 
      item2: // ... 
      //<> more items 
    object2: { /* .. */ } 
    //<> more objects 
} 

Bunlar ayrıştırmak için yaratılmış POJO s'dir (import ifadeleri için kısırlık uğruna çıkacağım) :

(1) Tam JSON nesnesinin temsili

public class JObjectContainer { 

    private List<JObject> jObjects ; 

    public JObjectContainer() { } 

    //get & set methods 

} 

(2) Yuvalanmış nesnelerin gösterimi:

 public class JObject { 

    private String id ; 
    private List<JNode> jObjects ; 

    public JObject() { } 

    //get & set methods 

} 

(3) Öğelerin gösterimi:

 public class JNode { 

    private JsonElement item1 ; 
    private JsonElement item2 ; 
    //<> more item fields 

    public JNode() { } 

    //get & set methods 

} 

Şimdi, bir gson örneği (jsonFile'i içe aktarmak için FileReader) oluşturmak,

 Gson gson = new Gson() ; 
JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ; 

Ayrılabilir nesneyi (örneğin ListIterator aracılığıyla) erişmeye çalıştığımda NullPointerException alıyorum. Gson , ancak yapar, belirtilen sınıfın bir nesnesini oluşturur ve , herhangi bir sonraki hataları atar.

Bunun daha önce yapıldığını biliyorum. Peki, neyi özlüyorum?

TIA

cevap

33

Bu mümkün değil. JSON yapınızı, dizisi'un öğeleri olarak object1, object2, vb. Temsil edecek şekilde değiştirmeniz gerekir. Şu anda, bir nesnenin, ne kadarının bilinmeyeceği bir nesnenin özellikleridir (başka bir deyişle, bir List olarak eşleştirmeyi denemediniz). GSON akıllı ancak bu akıllı :)

Böylece, temel bir örnek olarak, bir dizi ile bu JSON yapısı:

olması zorunlu değildir, Java gösterimi ile bir arada (içinde
{ nodes: 
    [ 
    { item1: 'value1a', item2: 'value2a' }, 
    { item1: 'value1b', item2: 'value2b' }, 
    { item1: 'value1c', item2: 'value2c' } 
    ] 
} 

POJO denir, ancak sadece javabean veya model nesne veya değer nesnesi).

public class Container { 
    private List<Node> nodes; 
    // +getter. 
} 

public class Node { 
    private String item1; 
    private String item2; 
    // +getters. 
} 

ve

Container container = new Gson().fromJson(json, Container.class); 

çalışmalıdır bu GSON çağrı.

Güncelleştirme: açık olması gerekirse, JSON yapınız sorun değil, Java nesne yapınızdır. Java nesne yapısı GSON işini yaptırmak için aşağıdaki gibi, o JSON yapısı görünmelidir ile bitirmek istiyorum tam olarak ne olduğunu varsayarsak:

{ jObjects: 
    [ 
    { id: 123, jObjects: 
     [ 
     { item1: 'value1a', item2: 'value2a' }, 
     { item1: 'value1b', item2: 'value2b' }, 
     { item1: 'value1c', item2: 'value2c' } 
     /* etc... commaseparated */ 
     ] 
    }, 
    { id: 456, jObjects: 
     [ 
     { item1: 'value1d', item2: 'value2d' }, 
     { item1: 'value1e', item2: 'value2e' }, 
     { item1: 'value1f', item2: 'value2f' } 
     /* etc... commaseparated */ 
     ] 
    } 
    /* etc... commaseparated */ 
    ] 
} 

Sadece JsonElement mülkiyet String değiştirilmesi gerektiğini, geçersiz olduğu için.

+1

Merhaba, cevabınız için teşekkürler! Tıpkı benim javascriptte yaptığım gibi, kapsayıcı içeriğini içerik için düzgün bir şekilde ayrıştırabilmek için tanımlayıcı dizeleri (ör., 'Object1') korumayı planlıyorum. Bunun hakkında nasıl gidebileceğini biliyor musun? – FK82

+0

Bu tanımlayıcı dizeler kapsayıcıya ('düğüm') değil, her öğeye ("Düğüm") bağlanırsa, bunun yerine 'Düğüm' yerine bir özellik yapmalısınız. Bilinmeyen miktarda özellik ve bilinmeyen özellik adları olan JS nesneleri, iyi bir fikir/uygulama değildir. Onları bir diziye koymanız ve diziye sabit bir ad vermeniz gerekir. – BalusC

+0

Bu, JSON'u tamamen birlikte kullanmanın amacını vurgular. JSAV'nin JAVA'daki nesne eşleme stilini yansıtamıyorsam, kendi API'mı yazabilirim. ;-) Temelde bu example while somehow retaining the identifier strings. – FK82

0

BalusC, spesifik soru wrt GSon (ve genel olarak bire bir veri bağlaması) için iyi işaretçiler verdiğini düşünüyorum; Ancak, daha dinamik bir işlem olması gerektiğini düşünüyorsanız, diğer JSON işleme paketlerini de değerlendirebilirsiniz. Birçok paketin, bir şeyleri haritalamak için ek veya alternatif yolları vardır: Json-lib, flexjson ve Jackson en azından Gson'a kıyasla eklenmiştir. Bazıları daha gevşek haritalama (türlerin isimlerinin isimlerini tanımlarsınız), diğerleri ise poliporfik türler için gerçek destek (bir Nesne bildirmekle birlikte aslında serileştirilmiş alt-tiple eşleştirilebilir) sunar.

+0

Merhaba, cevabınız için teşekkürler. Aslında, GSON'un dahili olarak nasıl çalıştığı konusunda emin değildim ve sonuçta nasıl kullanılacağını tam olarak anlamadım. Şimdi Rhino ile özel ayrıştırma kullanıyorum, ki bu benim görüşüme göre çok daha kullanışlı. Java, yuvalanmış veri nesnelerini, JavaScript'in yaptığı gibi basit bir şekilde desteklemez, bu yüzden Rhino'yu bu tür bir şey için kullanmamanın hiçbir gerçek sebebi yoktur. – FK82

İlgili konular