2008-09-11 20 views
21

जावा का उपयोग कर JSON में वेब सेवा क्लाइंट को डेटा वापस करने का कोई आसान तरीका है? मैं servlets, वसंत, आदि के साथ ठीक हूँजावा का उपयोग कर वेब सेवा के माध्यम से जेएसओएन प्रारूप में डेटा का खुलासा कैसे करूं?

+1

चूंकि यह एक अत्यधिक वोट दिया गया जावा + जेसन सवाल है, तो जवाबों को संक्षेप में अच्छा लगा सकता है; खासतौर से चूंकि यह एक पुराना सवाल है, और कई नए विकल्प उपलब्ध हो गए हैं (स्प्रिंग एमवीसी, जर्सी/रीस्टेसी/सीएक्सएफ/रीस्टलेट; जीसन/जैक्सन/फ्लेक्सजेसन) – StaxMan

उत्तर

5

मेरे लिए, the best Java <-> JSON parser is XStream (हाँ, मैं वास्तव में json के बारे में, बात कर रहा हूँ नहीं एक्सएमएल के बारे में) से उपयोगी है। एक्सस्ट्रीम पहले से ही परिपत्र निर्भरताओं से संबंधित है और इसमें एक सरल और शक्तिशाली एपीआई है जहां आप अपने ड्राइवर, कन्वर्टर्स और अन्य लिख सकते हैं।

सधन्यवाद

+4

माइनर नाइटपिक: एक्सस्ट्रीम एक JSON _parser_ नहीं है। यह एक ऑब्जेक्ट सीरिएलाइज़र है जो जेटसन का उपयोग करके JSON को पढ़/लिख सकता है, जो json.org पार्सर का उपयोग करता है और इसे स्टेक्स एक्सएमएल एपीआई के साथ सजाता है। – StaxMan

3

यूप! की जाँच करें json-lib

यहाँ अपने खुद के कोड से एक सरलीकृत कोड स्निपेट कि मेरे डोमेन वस्तुओं का एक सेट भेज है:

private String getJsonDocumenent(Object myObj) (
    String result = "oops"; 
    try { 
     JSONArray jsonArray = JSONArray.fromObject(myObj); 

     result = jsonArray.toString(2); //indent = 2 

    } catch (net.sf.json.JSONException je) { 

     throw je; 
    } 
    return result; 
} 
+0

जिज्ञासा से बाहर ... क्या परिणाम को आरंभ करने का कोई कारण है " उफ़ "? वह मान इस विधि से कभी वापस नहीं किया जा सकता है, है ना? – danb

+0

मैंने अभी स्निपेट के लिए ऐसा किया - मेरा उत्पादन कोड वास्तव में जिस से मैंने इसे सोर्स किया है, वास्तव में अपवाद नहीं फेंकता है, लेकिन क्लाइंट ऐप के लिए एक स्ट्रिंग कॉन्स्टेंस जेसन दस्तावेज़ अच्छी तरह से पचाने के लिए। –

7

हम परिवर्तित जावा JSON करने के लिए वस्तुओं और यह पाया है के लिए Flexjson उपयोग किया गया है उपयोग करने के लिए बहुत आसान है। http://flexjson.sourceforge.net

यहाँ कुछ उदाहरण हैं:

public String searchCars() { 
    List<Car> cars = carsService.getCars(manufacturerId); 
    return new JSONSerializer().serialize(cars); 
} 

यह deepSerialize के रूप में कुछ शांत सुविधाओं की है पूरे ग्राफ भेजने के लिए और यह द्वि दिशात्मक रिश्तों के साथ नष्ट नहीं होती है। सर्वर साइड पर

new JSONSerializer().deepSerialize(user); 

का प्रारूपण दिनांकों अक्सर बहुत

new JSONSerializer().transform(
    new DateTransformer("dd/MM/yyyy"),"startDate","endDate" 
).serialize(contract); 
+0

फ्लेक्सजेसन सबसे अच्छा जावा-> JSON serialization विकल्प जैसा मैंने देखा है। लेकिन मेरे पास दूसरी तरफ जावा प्राप्त हो रहा है ... deserializing के लिए कोई सुझाव? – skiphoppy

+0

नौकरी करने के लिए flexjson JSONDeserializer का उपयोग कर सकते हैं। मैं मुद्दों के बिना दोनों तरीकों का उपयोग कर रहा हूँ। – prageeth

1

जावा में RESTful वेब सेवाओं के लिए, यह भी Restlet API जो (, दोनों सर्वर और ग्राहक एक कंटेनर या स्टैंडअलोन में) बाकी वेब सेवाओं के लिए एक बहुत शक्तिशाली और लचीला अमूर्त प्रदान करता है की जाँच, और भी जुड़ता है वसंत और जेएसओएन के साथ अच्छी तरह से।

17

Jersey में देखने लायक हो सकता है। जर्सी आराम से वेब सेवाओं को एक्सएमएल और/या जेएसओएन के रूप में बेनकाब करना आसान बनाता है।

एक उदाहरण ... फिर एक संसाधन

@Path("/blah") 
public class BlahResource { 
    private Set<Blah> blahs = new HashSet<Blah>(); 

    @Context 
    private UriInfo context; 

    public BlahResource() { 
     blahs.add(new Blah(1, "blah the first")); 
     blahs.add(new Blah(2, "blah the second")); 
    } 

    @GET 
    @Path("/{id}") 
    @ProduceMime({"application/json", "application/xml"}) 
    public Blah getBlah(@PathParam("id") Integer id) { 
     for (Blah blah : blahs) { 
      if (blah.getId().equals(id)) { 
       return blah; 
      } 
     } 
     throw new NotFoundException("not found"); 
    } 
} 

बना सकते हैं और इसे उजागर एक साधारण वर्ग

@XmlType(name = "", propOrder = { "id", "text" }) 
@XmlRootElement(name = "blah") 
public class Blah implements Serializable { 
    private Integer id; 
    private String text; 

    public Blah(Integer id, String text) { 
     this.id = id; 
     this.text = text; 
    }  

    @XmlElement 
    public Integer getId() { return id; } 
    public void setId(Integer id) { this.id = id; } 

    @XmlElement 
    public String getText() { return text; } 
    public void setText(String value) { this.text = value; } 
} 

साथ शुरू करते हैं। ऐसा करने के कई तरीके हैं, जैसे जर्सी के ServletContainer का उपयोग करके। (Web.xml)

<servlet> 
    <servlet-name>jersey</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jersey</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Thats तुम सब करने की जरूरत है ... पॉप अपना ब्राउज़र खोलें और http://localhost/blah/1 को ब्राउज़ करें। डिफ़ॉल्ट रूप से आप एक्सएमएल आउटपुट देखेंगे। यदि आप फ़ायरफ़ॉक्स का उपयोग कर रहे हैं, तो JSON आउटपुट देखने के लिए TamperData इंस्टॉल करें और accept शीर्षलेख application/json पर बदलें।

स्पष्ट रूप से इसके लिए बहुत कुछ है, लेकिन Jersey यह सब कुछ आसान बनाता है।

शुभकामनाएं!

+0

बिल्कुल: जेएसओ जेएसओएन-आधारित/जागरूक वेब सेवाओं के लिए उपयोग करने की बात है। – StaxMan

1

जैसा कि पहले से ही उल्लेख किया गया है, Jersey (जेएक्स-आरएस इम्प्लायर) उपयोग करने के लिए ढांचा है; लेकिन JSON से जावा ऑब्जेक्ट्स के मूल मैपिंग के लिए, Tutorial अच्छा है। कई विकल्पों के विपरीत, यह अजीब एक्सएमएल-संगतता सम्मेलनों का उपयोग नहीं करता है लेकिन स्वच्छ जेएसओएन को पढ़ता है और लिखता है जो सीधे वस्तुओं से और उससे मानचित्र करता है। इसमें नल के साथ कोई समस्या नहीं है (लापता प्रविष्टि और एक नल के बीच अंतर है), खाली सूचियां या स्ट्रिंग्स (दोनों नल से अलग हैं)।

जैक्सन जर्सी के साथ अच्छी तरह से काम करता है, या तो जेएक्स-आरएस प्रदाता जार का उपयोग करता है, या यहां तक ​​कि मैन्युअल रूप से भी। इसी तरह सादे पुराने servlets के साथ उपयोग करना मुश्किल है; बस इनपुट/आउटपुट स्ट्रीम प्राप्त करें, ऑब्जेक्टमैपर.readValue() और .writeValue() पर कॉल करें, और यह इसके बारे में है।

2

मुझे Google-gson आकर्षक मिल गया है। यह जेएसओएन और पीठ में बदल जाता है। http://code.google.com/p/google-gson/ यह बहुत लचीला है और वस्तुओं को जटिल तरीके से संभाल सकता है। मुझे जेनेरिक के लिए इसका समर्थन पसंद है।

/* 
* we're looking for results in the form 
* {"id":123,"name":thename},{"id":456,"name":theOtherName},... 
* 
* TypeToken is Gson--allows us to tell Gson the data we're dealing with 
* for easier serialization. 
*/ 
Type mapType = new TypeToken<List<Map<String, String>>>(){}.getType(); 

List<Map<String, String>> resultList = new LinkedList<Map<String, String>>(); 

for (Map.Entry<String, String> pair : sortedMap.entrySet()) { 
    Map<String, String> idNameMap = new HashMap<String, String>(); 
    idNameMap.put("id", pair.getKey()); 
    idNameMap.put("name", pair.getValue()); 
    resultList.add(idNameMap); 
} 

return (new Gson()).toJson(resultList, mapType); 
1

मैं JSON प्रारूप वेब सेवाएं प्रदान करने के लिए jaxws-json का उपयोग कर रहा हूं। आप प्रोजेक्ट https://jax-ws-commons.dev.java.net/json/ देख सकते हैं।

यह एक अच्छी परियोजना है, एक बार जब आप इसे प्राप्त कर लेंगे, तो आप पाएंगे कि यह कितना आकर्षक है।

+0

क्या आप इस पर अधिक जानकारी प्रदान कर सकते हैं? विशेष रूप से अगर हम केवल मौजूदा दृष्टिकोण को बदलकर जेएसओएन में मौजूदा जैक्सबी (एसओएपी) सेवा को कन्वर्ट करना चाहते हैं? –

+0

यह मौजूदा jaxws के लिए एक विस्तार है। वेब सेवा को एसओएपी-सक्षम के रूप में प्रकाशित करने के बजाय, यह वेब सेवा जेएसओएन को समझ लेगा (केवल @ बाइंडिंग टाइप (JSONBindingID.JSON_BINDING) जोड़ना)। – lwpro2

+0

ग्राहकों के लिए, एसओएपी के माध्यम से संवाद करने की बजाय, JSON का उपयोग किया जाना चाहिए। स्रोत कोड संकलित करने के लिए आपको थोड़ा कठिन लग सकता है। हालांकि, जेएआर सही ढंग से जेनरेट करने के बाद, इसका उपयोग करना आसान हो गया। उन्होंने वहां वास्तव में एक महान काम किया है। असल में यह एकमात्र "सच्चा" JSON बाध्यकारी समाधान है जो मैंने पाया है। – lwpro2