2010-09-22 8 views
12

मैं जेसन को जावा बीन्स में पार्स करने के लिए जीसन का उपयोग कर रहा हूं। एपीआई के लिए मैं उपयोग कर रहा हूं, जेसन परिणामों की एक बड़ी संख्या में परिणाम एक जेसन ऑब्जेक्ट की पहली संपत्ति के रूप में शामिल है। "जीसन रास्ता" एक समकक्ष रैपर जावा ऑब्जेक्ट बनाने के लिए प्रतीत होता है, जिसमें लक्ष्य आउटपुट प्रकार के लिए एक संपत्ति है - लेकिन इसके परिणामस्वरूप अनावश्यक फेंकने वाले वर्ग होते हैं। क्या ऐसा करने का सबसे अच्छा तरीका है?जीएसन का उपयोग करते हुए जेसन का विश्लेषण करने का सबसे आसान तरीका क्या है जब पार्स तत्व तत्व जेसन स्ट्रिंग का तत्व है?

उदाहरण पार्स करने के लिए के लिए:

public class ParseProfile extends TestCase { 
    public void testParseProfile() { 
     Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); 
     String profileJson = "{\"profile\":{\"username\":\"nickstreet\",\"first_name\":\"Nick\",\"last_name\":\"Street\"}}"; 
     ProfileContainer profileContainer = gson.fromJson(profileJson, ProfileContainer.class); 
     Profile profile = profileContainer.getProfile(); 
     assertEquals("nickstreet", profile.username); 
     assertEquals("Nick", profile.firstName); 
     assertEquals("Street", profile.lastName); 
    } 
} 

public class ProfileContainer { 
    protected Profile profile; 

    public Profile getProfile() { 
     return profile; 
    } 

    public void setProfile(Profile profile) { 
     this.profile = profile; 
    } 
} 

public class Profile { 
    protected String username; 
    protected String firstName; 
    protected String lastName; 

    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 
पाठ्यक्रम एक कंटेनर का उपयोग करने के लिए एक वैकल्पिक दृष्टिकोण मैन्युअल स्ट्रिंग के बाहरी हिस्से को हटाने के लिए होगा का

(यानी निकालें: {"profile":{"username":"nickstreet","first_name":"Nick","last_name":"Street"}}

मैं क्या करना है मानक प्रोफाइल स्ट्रिंग पार्सिंग तकनीकों का उपयोग करके "प्रोफ़ाइल": {और बंद}), लेकिन यह गलत दृष्टिकोण की तरह लगता है।

मैं की तरह कुछ करने के लिए सक्षम होने के लिए करना चाहते हैं:

Profile p = gson.fromJsonProperty(json, Profile.class, "profile"); 

This issue चलता है कि यह एक json वस्तु में एक json स्ट्रिंग को तोड़ने के लिए, इस वस्तु से एक jsonElement बाहर निकलने के लिए, और पारित संभव हो जाना चाहिए यह json.fromJson() में। हालांकि, toJsonElement() विधि केवल जावा ऑब्जेक्ट पर काम करती है, न कि एक जेसन स्ट्रिंग।

क्या किसी के पास बेहतर दृष्टिकोण है?

उत्तर

8

मैं एक ही समस्या में भाग गया। असल में आप सभी कंटेनर क्लास बकवास से बचने के लिए क्या करते हैं, केवल जेएसओओब्जेक्ट फ़ंक्शंस का उपयोग उस आंतरिक-ऑब्जेक्ट को पुनर्प्राप्त करने के लिए करें जिसे आप deserialize करने का प्रयास कर रहे हैं। मुझे मैला कोड के लिए क्षमा करें लेकिन यह इस तरह कुछ जाता है:

GsonBuilder gsonb = new GsonBuilder() 
Gson gson = gsonb.create(); 

JSONObject j; 
JSONObject jo; 

Profile p = null; 

try { 

    j = new JSONObject(convertStreamToString(responseStream)); 
    jo = j.getJSONObject("profile"); // now jo contains only data within "profile" 
    p = gson.fromJson(jo.toString(), Profile.class); 
    // now p is your deserialized profile object 
}catch(Exception e) { 
    e.printStackTrace(); 
} 
+2

प्रतिक्रिया के लिए धन्यवाद। यह काफी सही नहीं है, लेकिन यह मुझे सही जवाब के लिए नेतृत्व किया। आप स्ट्रिंग के साथ सीधे जेसनऑब्जेक्ट नहीं बना सकते हैं, आपको इसे बनाने के लिए जेसन पार्सर का उपयोग करना होगा। जेसन पार्सर पार्सर = नया जेसन पार्सर(); जेसनऑब्जेक्ट जे = (जेसनऑब्जेक्ट) पार्सर.परसे (जेसन); –

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