2010-08-10 12 views
16

के साथ पार्स जेसन मैं अपने जीडब्ल्यूटी 2.0 एप्लिकेशन में प्रवाह से आने वाले जेएसओएन को पार्स करने की कोशिश कर रहा हूं।जीएसटी 2.0

सबसे अच्छा तरीका क्या है? क्या मुझे javascriptobject का उपयोग करना चाहिए? JSonParser? मैं वेब पर जो पाया जा रहा हूं उसके साथ मैं खो गया हूं क्योंकि कभी भी gwt संस्करण नहीं है।

String text = "{\"item\":[{\"Id\":\"1\",\"Name\":\"Bob\"},{\"Id\":\"2\",\"Name\":\"John\"},{\"Id\":\"3\",\"Name\":\"Bill\"}]}"; 

मैं अपनी वस्तुओं की सूची के साथ कैसे खेल सकता हूं? किसी भी मदद

उत्तर

33

जवाब पर निर्भर करता है के लिए पहले से

धन्यवाद आप कितना विश्वास है कि JSON :) बेशक, यह आपके आवेदन से आ रही हो सकता है, लेकिन कुछ अविश्वसनीय उपयोगकर्ता इनपुट सम्मिलित हैं, तो आप एक संभावित सुरक्षा का सामना कर रहे छेद।

तो:

  • JSONs के लिए विश्वसनीय स्रोतों से, मैं JavaScript Overlay Types का उपयोग करें। वे जीडब्ल्यूटी सीमलेस के साथ जेएसओएन को एकीकृत करते हैं और मैं निश्चित रूप से इस दृष्टिकोण की सिफारिश करता हूं। हालांकि, आंतरिक रूप से, यह eval() फ़ंक्शन का अर्थ है जिसका अर्थ है (कम से कम) दो चीजें: JSON पार्सिंग बेहद तेज़ होगा (यह उस के लिए ब्राउज़र मूल कोड का उपयोग करता है) और संभवतः असुरक्षित होगा। JSON संबंधित सुरक्षा समस्याओं के बारे में अधिक जानकारी के लिए Google। JSONParser JS12 को eval() के माध्यम से भी पार्स कर सकता है, जब आप इसकी parseLenient(String jsonString) विधि का आह्वान करते हैं, लेकिन यह जेएसओ से निश्चित रूप से कम आकर्षक है।
  • अविश्वस्त स्रोतों/इनपुट के लिए, आप JSONParser.parseStrict(String jsonString) के माध्यम से JSONParser (GWT> = 2.1 में उपलब्ध) का उपयोग करना चाहिए - आप और अधिक कोड कि जिस तरह से लिखने के लिए होगा, लेकिन आप यह सुनिश्चित करें कि इनपुट ठीक से नियंत्रित किया जाता है हो सकता है। आप जेएसओ के साथ "आधिकारिक" JSON parser from json.org को एकीकृत करने में भी देख सकते हैं - एक JSNI फ़ंक्शन लिखें जो पार्स किए गए ऑब्जेक्ट को लौटाता है और इसे अपने जेएसओ पर डाला जाता है - सिद्धांत में यह काम करना चाहिए;) (यही वह है जो जीडब्लूटी आंतरिक रूप से जेएसओ के साथ करता है मैं क्या समझ में आ से)

JSON में सूचियों तक पहुँचने के लिए के रूप में, वहाँ उस के लिए उचित वर्ग हैं: JsArray (सामान्य, अन्य JSOs), JsArrayString, आदि आप उनके कार्यान्वयन को देखें, तो की सूची के लिए, वे तो बस कर रहे हैं देशी जेएस सरणी के आस-पास जेएसएनआई रैपर, इसलिए वे बहुत तेज हैं (लेकिन कुछ कारणों से सीमित हैं)।टिम टिप्पणी के जवाब में


संपादित करें:

मैं एक साधारण सार वर्ग कि बॉयलरप्लेट कोड, कम से कम करने में मदद करता है लिखा था जब JSOs और JSON के साथ काम:

import com.google.gwt.core.client.JavaScriptObject; 

public abstract class BaseResponse extends JavaScriptObject { 
    // You can add some static fields here, like status codes, etc. 

    /** 
    * Required by {@link JavaScriptObject} 
    */ 
    protected BaseResponse() { } 

    /** 
    * Uses <code>eval</code> to parse a JSON response from the server 
    * 
    * @param responseString the raw string containing the JSON repsonse 
    * @return an JavaScriptObject, already cast to an appropriate type 
    */ 
    public static final native <T extends BaseResponse> T getResponse(String responseString) /*-{ 
     // You should be able to use a safe parser here 
     // (like the one from json.org) 
     return eval('(' + responseString + ')'); 
    }-*/; 
} 

तो फिर तुम अपने वास्तविक जेएसओ को इस प्रकार लिखें:

import com.example.client.model.User; 

public class LoginResponse extends BaseResponse { 

    protected LoginResponse() { } 

    public final native String getToken() /*-{ 
     return this.t; 
    }-*/; 

    public final native int getId() /*-{ 
     return parseInt(this.u[0]); 
    }-*/; 

    // ... 

    // Helper method for converting this JSO to a POJO 
    public final User getUser() { 
     return new User(getLogin(), getName(), getLastName()); 
    } 
} 

और अंत में अपने कोड में:

// response.getText() contains the JSON string 
LoginResponse loginResponse = LoginResponse.getResponse(response.getText()); 
//^no need for a cast \o/ 

आपका JSON इस (JSONLint के सौजन्य से, एक महान JSON सत्यापनकर्ता) की तरह दिखता है:

{ 
    "item": [ 
     { 
      "Id": "1", 
      "Name": "Bob" 
     }, 
     { 
      "Id": "2", 
      "Name": "John" 
     }, 
     { 
      "Id": "3", 
      "Name": "Bill" 
     } 
    ] 
} 

तो, मैं एक JSO लिखते हैं कि आइटम का वर्णन उस सूची:

public class TestResponse extends BaseResponse { 

    protected TestResponse() { } 

    public final native String getId() /*-{ 
     return this.Id; 
    }-*/; 

    public final native String getName() /*-{ 
     return this.Name; 
    }-*/; 

    // Static helper for returning just the list 
    // Code untested but you should get the idea ;) 
    public static final native JsArray<TestResponse> getTestList(String json) /*-{ 
     var stuff = eval('(' + json + ')'); 
      return stuff.item; 
    }-*/; 
} 

फिर, अपने कोड में आप TestResponse.getTestList(someJsonString) फोन औरके साथ चारों ओर खेलनेआपको मिलता है (TestResponse एस इसमें स्वचालित रूप से बनाए गए हैं)। अच्छा, आह? ;) यह एक सा पहली बार में भ्रमित हो सकता है, लेकिन विश्वास है मुझे यह समझदारी की बात कर देगा एक बार आप इसे का उपयोग शुरू करने और इसे एक बहुतJSONParser के माध्यम से पार्स करने> _>

+0

आपकी मदद के लिए धन्यवाद, मैं जा रहा हूँ की तुलना में आसान है जेएस ओवरले प्रकारों का उपयोग करने के लिए। लेकिन ग्राहक प्राप्त करने के लिए मैं अपने जेसन टेक्स्ट का अनुवाद कैसे करूं? उदाहरण में, वह उपयोग करता है: $ wnd.jsonData [0]; मेरे मामले में मेरे पास एक स्ट्रिंग है (एक अनुरोधबिल्डर से आ रहा है) – Tim

+0

पूरी तरह से काम कर रहा है, धन्यवाद। मैं eval समारोह चूक गया। सर्वोत्तम संबंध – Tim

+0

आपने स्ट्रिंग के चारों ओर ब्रेक का उपयोग क्यों किया? इस कोड में: 'वापसी eval ('(' + respondString + ')');' – Davor