2017-05-02 8 views
7

सबसे पहले, मेरे प्रश्न को बंद करने का निर्णय लेने से पहले, मैंने this समाधान का प्रयास किया है, लेकिन यह मेरे लिए काम नहीं कर रहा है।एक ही समय में ठीक से स्वरूपित एक्सएमएल और जेएसओएन उत्पन्न नहीं कर सकता

मेरे पास एक REST सेवा है जो Accept शीर्षलेख के आधार पर JSON या XML वापस करने वाली है। मैं इसे उचित JSON उत्पन्न कर सकता हूं, लेकिन एक्सएमएल नहीं। जब मैं एक्सएमएल को ठीक करता हूं तो जेएसओएन खराब हो जाता है। नीचे मैं अपना कोड पेश कर रहा हूं।

एक्सएमएल अच्छा लगता है, लेकिन JSON नहीं

Message.java

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElementRef; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Message { 
    int id; 
    String text; 

    @XmlElementWrapper 
    @XmlElementRef 
    List<Comment> comments; 

    public Message() { 

    } 
    // getters and setters 
} 

Comment.java

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "comment") 
public class Comment { 
    int id; 
    String text; 

    public Comment() { 

    } 
    //getters and setters 
} 

MessageResource.java

import java.util.List; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 


@Path("messages") 
public class MessageResource { 

    DBUtils db = new DBUtils(); 

    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    public Response getXML() { 
     List<Message> messages = db.getMessages(); 
     return Response.ok(messages.toArray(new Message[messages.size()]), MediaType.APPLICATION_XML).build(); 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getJSON() { 
     List<Message> messages = db.getMessages(); 
     return Response.ok(messages.toArray(new Message[messages.size()]), MediaType.APPLICATION_JSON).build(); 
    } 
} 

यहाँ XML परिणाम है, जो ठीक है:

<messages> 
    <message> 
     <id>1</id> 
     <text>Java is an OOP language.</text> 
     <comments> 
      <comment> 
       <id>20</id> 
       <text>That's correct.</text> 
      </comment> 
      <comment> 
       <id>30</id> 
       <text>test test</text> 
      </comment> 
     </comments> 
    </message> 
    <message> 
     <id>1</id> 
     <text>Java is an OOP language.</text> 
     <comments> 
      <comment> 
       <id>20</id> 
       <text>That's correct.</text> 
      </comment> 
      <comment> 
       <id>30</id> 
       <text>test test.</text> 
      </comment> 
     </comments> 
    </message> 
</messages> 

और यहाँ JSON परिणाम है, comments पर ध्यान देना। मुझे बस एक comments सरणी चाहिए।

[ 
    { 
    "id": 1, 
    "text": "Java is an OOP language.", 
    "comments": { 
     "comment": [ 
     { 
      "id": 20, 
      "text": "That's correct." 
     }, 
     { 
      "id": 30, 
      "text": "test test" 
     } 
     ] 
    } 
    }, 
    { 
    "id": 1, 
    "text": "Java is an OOP language.", 
    "comments": { 
     "comment": [ 
     { 
      "id": 20, 
      "text": "That's correct." 
     }, 
     { 
      "id": 30, 
      "text": "test test." 
     } 
     ] 
    } 
    } 
] 

JSON फिक्सिंग

XML प्रतिक्रिया को खराब करता अगर मैं Message वर्ग से @XmlElementWrapper और @XmlElementRef एनोटेशन बाहर निकालना है, तो यह JSON के लिए काम करता है, लेकिन नहीं एक्सएमएल।

Message.jave

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Message { 
    int id; 
    String text; 

    List<Comment> comments; 

    public Message() { 

    } 
    //getters and setters 
} 

Comment और MessageResource कक्षाएं ही रहते हैं। - ठीक है

[ 
    { 
    "id": 1, 
    "text": "Java is an OOP language.", 
    "comments": [ 
     { 
     "id": 20, 
     "text": "That's correct." 
     }, 
     { 
     "id": 30, 
     "text": "test test" 
     } 
    ] 
    }, 
    { 
    "id": 1, 
    "text": "Java is an OOP language.", 
    "comments": [ 
     { 
     "id": 20, 
     "text": "That's correct." 
     }, 
     { 
     "id": 30, 
     "text": "test test." 
     } 
    ] 
    } 
] 

XML -

JSON गलत

<messages> 
    <message> 
     <id>1</id> 
     <text>Java is an OOP language.</text> 
     <comments> 
      <id>20</id> 
      <text>That's correct.</text> 
     </comments> 
     <comments> 
      <id>30</id> 
      <text>test test</text> 
     </comments> 
    </message> 
    <message> 
     <id>1</id> 
     <text>Java is an OOP language.</text> 
     <comments> 
      <id>20</id> 
      <text>That's correct.</text> 
     </comments> 
     <comments> 
      <id>30</id> 
      <text>test test.</text> 
     </comments> 
    </message> 
</messages> 

कैसे एक साथ इन दो काम करने के लिए किसी को भी पता है:

यहाँ परिणाम मैं मिलता है? जेएसओएन के लिए एक्सएमएल और जीएसओएन के लिए जेएक्सबी का उपयोग करने वाला एकमात्र समाधान है, लेकिन मुझे जीएसओएन का उपयोग करके जेएसओएन ऑब्जेक्ट्स मैन्युअल रूप से बनाना है।

धन्यवाद!

+0

आप [JacksonJaxbJSON] करने के लिए देखा है (http://fasterxml.github.io/jackson-jaxrs-json-provider/javadoc/2.0.1/com/ fastxml/जैक्सन/जैक्सर्स/जेसन/जैक्सन जैक्सबीजेसनप्रोवाइडर.html) एनोटेशन? 'जेसन टाइप' की तरह .. – ulab

+0

@ulab, क्या आप मुझे इसका उपयोग करने का एक उदाहरण दिखा सकते हैं? मैंने इसे पहले नहीं देखा है। –

उत्तर

5

मेरा प्रस्तावित समाधान एक्सएमएल (जैसे आप) के लिए जेएक्सबी का उपयोग करता है। लेकिन जेएसओएन के लिए यह जैक्सन-जेएक्सआरएस (आपके विपरीत) का उपयोग करता है, उदाहरण के लिए इस answer में वर्णित है। तो, जीएसओएन का उपयोग करने के बजाय आपको जैक्सन-जेएक्सआरएस का उपयोग करना होगा (उदाहरण के लिए Maven से)।

वांछित एक्सएमएल और जेएसओएन आउटपुट प्राप्त करने के लिए, आपको Message कक्षा में List<Comment> comments संपत्ति के एनोटेशन को ट्यून करना होगा।

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Message { 
    int id; 
    String text; 

    @XmlElementWrapper(name="comments") 
    @XmlElementRef 
    @JsonUnwrapped 
    List<Comment> comments; 

    //getters and setters 
} 

@XmlElementRef करके आप प्रत्येक Comment वस्तु एक <comment> तत्व के रूप में लिखा मिलता है। अंत में, @XmlElementWrapper(name="comments") द्वारा आप इन सभी को <comments> तत्व में लपेटते हैं।

XML आउटपुट है:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<messages> 
    <message> 
    <id>1</id> 
    <text>Java is an OOP language.</text> 
    <comments> 
     <comment> 
     <id>20</id> 
     <text>That's correct.</text> 
     </comment> 
     <comment> 
     <id>30</id> 
     <text>test test.</text> 
     </comment> 
    </comments> 
    </message> 
    <message> 
    <id>1</id> 
    <text>Java is an OOP language.</text> 
    <comments> 
     <comment> 
     <id>20</id> 
     <text>That's correct.</text> 
     </comment> 
     <comment> 
     <id>30</id> 
     <text>test test.</text> 
     </comment> 
    </comments> 
    </message> 
</messages> 

@JsonUnwrapped तक (पैकेज com.fasterxml.jackson.annotation से आयात) आप List<Comment> comments वस्तुओं की एक सादे सरणी के रूप में लिखा मिलता है।

JSON उत्पादन होता है:

[ 
    { 
    "id": 1, 
    "text": "Java is an OOP language.", 
    "comments": [ 
     { 
     "id": 20, 
     "text": "That's correct." 
     }, 
     { 
     "id": 30, 
     "text": "test test." 
     } 
    ] 
    }, 
    { 
    "id": 1, 
    "text": "Java is an OOP language.", 
    "comments": [ 
     { 
     "id": 20, 
     "text": "That's correct." 
     }, 
     { 
     "id": 30, 
     "text": "test test." 
     } 
    ] 
    } 
] 
+0

धन्यवाद! आपका समाधान सही एक्सएमएल का उत्पादन कर रहा है, और लगभग सही JSON है, सिवाय इसके कि सरणी का नाम "टिप्पणी" है और "टिप्पणियां" नहीं है। मुझे इसे काम करने के लिए एक्सएमएल एनोटेशन बदलना पड़ा। मैंने इन एनोटेशन 'एक्सएमलेमेंटमेंट रैपर (नाम = "टिप्पणियां") @XMLElementRef @ JsonUnrwapped' का उपयोग किया। –

+0

@TurikMirash आपकी प्रतिक्रिया के लिए धन्यवाद! मैंने आपके उत्तर में एक्सएमएल एनोटेशन के साथ अपना जवाब अपडेट किया। –

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