2012-04-05 23 views
12

मैं जावा ऑब्जेक्ट्स को जेसन प्रतिक्रिया में बदलने के लिए Gson लाइब्रेरी का उपयोग करता हूं ... समस्या यह है कि जेपीए अनुरोध के बाद डीबी से पुनर्प्राप्त ऑब्जेक्ट को अन्य संस्थाओं (see my previous question) के साथ एक पुनरावर्ती संबंध के कारण परिवर्तित नहीं किया जा सकता है:बिडरेक्शनल रिकर्सिव रिश्तों को हटाने का सबसे आसान तरीका?

public class Gps implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "IMEI", nullable = false, length = 20) 
    private String imei; 
    //some code here... 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "gpsImei", fetch = FetchType.LAZY) 
    private List<Coordonnees> coordonneesList; 


public class Coordonnees implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "IDCOORDONNEES", nullable = false) 
    private Integer idcoordonnees; 
    //some code here... 
    @JoinColumn(name = "GPS_IMEI", referencedColumnName = "IMEI", nullable = false) 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Gps gpsImei; 

मेरे स्रोत कोड:

EntityManagerFactory emf=Persistence.createEntityManagerFactory("JavaApplication21PU"); 
    GpsJpaController gjc=new GpsJpaController(emf); 

    Gps gps=gjc.findGps("123456789"); 

    for(int i=0;i<gps.getCoordonneesList().size();i++){ 
    gps.getCoordonneesList().get(i).setGpsImei(null); 
    } 

    Gson gson=new Gson(); 
    String json=gson.toJson(gps);//convert to json response 

    System.out.println(json); 

आप यहाँ देख मैं बनाया जा सकता है के रूप में:

for(int i=0;i<gps.getCoordonneesList().size();i++){ 
    gps.getCoordonneesList().get(i).setGpsImei(null); 
    } 

केवल समन्वय सूची में प्रत्येक जीपीएस ऑब्जेक्ट के लिए शून्य सेट करके रिकर्सिव रिलेशनशिप को मारने के लिए ..

आपकी राय में यह एक अच्छा समाधान है या क्या कोई और तरीका अधिक व्यावहारिक है? धन्यवाद

उत्तर

25

GraphAdapterBuilder नामक एक जीसन एक्सटेंशन है जो परिपत्र संदर्भ वाले ऑब्जेक्ट्स को क्रमबद्ध कर सकता है। यहाँ इसी परीक्षण मामले से एक बहुत ही सरल उदाहरण है:

Roshambo rock = new Roshambo("ROCK"); 
Roshambo scissors = new Roshambo("SCISSORS"); 
Roshambo paper = new Roshambo("PAPER"); 
rock.beats = scissors; 
scissors.beats = paper; 
paper.beats = rock; 

GsonBuilder gsonBuilder = new GsonBuilder(); 
new GraphAdapterBuilder() 
    .addType(Roshambo.class) 
    .registerOn(gsonBuilder); 
Gson gson = gsonBuilder.create(); 
System.out.println(gson.toJson(rock)); 

यह प्रिंट:

{ 
    '0x1': {'name': 'ROCK', 'beats': '0x2'}, 
    '0x2': {'name': 'SCISSORS', 'beats': '0x3'}, 
    '0x3': {'name': 'PAPER', 'beats': '0x1'} 
} 

ध्यान दें कि GraphAdapterBuilder वर्ग gson.jar में शामिल नहीं है। यदि आप इसका उपयोग करना चाहते हैं, तो आपको इसे अपने प्रोजेक्ट में मैन्युअल रूप से कॉपी करना होगा।

+1

धन्यवाद कायम की है! हाइबरनेट के साथ काम करते समय यह एक lifesaver था। जीएसन का उपयोग करते हुए एक हाइबरनेट इकाई को परिवर्तित करते समय मुझे परेशानी का एक गुच्छा बचाया। – Knubo

+0

एंड्रॉइड पर भी काम करता है। –

+3

कौन सा जार इस "GraphAdapterBuilder" कक्षा है? – pavan

2

मुझे जीसन के बारे में पता नहीं है लेकिन मैं जैक्सन के साथ काम कर रहा हूं। ऑब्जेक्टमैपर क्लास का उपयोग करने का एक उदाहरण देखें। रिकर्सन के लिए, इसे रोकने के लिए @JsonManagedReference और @JsonBackReference का उपयोग करें। उदाहरण के लिए भी उन्हें देखो।

1

संग्रह को क्रमबद्ध करने से बचने के लिए आप @Expose (serialize = false) का उपयोग कर सकते हैं। क्षणिक @OneToMany अनदेखी के लिए

0

उपयोग google.gson के लिए

संबंधित मुद्दे