2015-05-02 8 views
9

मैं gson का उपयोग कर की जरूरत है json स्ट्रिंग deserialize करने के लिए एक Android ऐप्लिकेशन लिख रहा हूँ जारी:Gson नल पॉइंटर deserialize apk

{ 
    "reply_code": 001, 
    "userinfo": { 
     "username": "002", 
     "userip": 003 
    } 
} 

तो मैं दो वर्गों बनाने के लिए:

public class ReturnData { 
    public String reply_code; 
    public userinfo userinfo; 
} 

public class userinfo { 
    public String username; 
    public String userip; 
} 

अंत में, मेरे जावा MainActivity.java में कोड:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Context context= MainActivity.this; 

    //Test JSON 
    String JSON="{\"reply_code\": 001,\"userinfo\": {\"username\": \"002\",\"userip\": 003}}"; 
    Gson gson = new Gson(); 
    ReturnData returnData=gson.fromJson(JSON,ReturnData.class); 

    if(returnData.reply_code==null) 
     Toast.makeText(context,"isNULL",Toast.LENGTH_SHORT).show(); 
    else 
     Toast.makeText(context,"notNULL",Toast.LENGTH_SHORT).show(); 
} 

क्या मुझे उलझन में बनाई गई है, जब मैं अनुप्रयोग डिबग, यह अच्छी तरह से भाग गया और उत्पादन "notNULL" मैं सीए n देखें कि ऑब्जेक्ट के प्रत्येक एट्रिब्यूशन को ठीक से deserialized किया गया है। हालांकि, जब मैंने एंड्रॉइड स्टूडियो से एपीके जारी किया और फोन पर एपीके चलाया, तो यह आउटपुट "आईएसएनयूएलएल" था, जेसन रिज़ॉल्यूशन असफल रहा!

मुझे कौन बता सकता है कि क्या हुआ ?!

पुनश्च: build.gradle:

apply plugin: 'com.android.application' 
android { 
compileSdkVersion 19 
buildToolsVersion "19.1" 

defaultConfig { 
    applicationId "com.padeoe.autoconnect" 
    minSdkVersion 14 
    targetSdkVersion 21 
    versionCode 1 
    versionName "2.1.4" 
} 
buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 
compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 
} 

dependencies { 
compile fileTree(include: ['*.jar'], dir: 'libs') 
compile files('src/gson-2.3.1.jar') 
} 
+0

प्रोजेरड फ़ाइल दिखाएं। –

+0

@No नाम क्या आपका मतलब build.gradle है? मैंने अभी अपलोड किया है। – padeoe

+0

कोई शो 'proguard-android।txt 'file –

उत्तर

21

आप ProGuard सक्षम किया गया है आपके release बिल्ड प्रकार में - minifyEnabled true। यह वर्ग/चर नामों को बदलकर कोड को खराब कर देता है।

आप अपने वर्ग गुण व्याख्या चाहिए ताकि Gson जानता है देखने के लिए क्या:

public class ReturnData { 
    @SerializedName("reply_code") 
    public String reply_code; 
    @SerializedName("userinfo") 
    public userinfo userinfo; 
} 

public class userinfo { 
    @SerializedName("username") 
    public String username; 
    @SerializedName("userip") 
    public String userip; 
} 

इस तरह Gson गुण के नाम पर देखने नहीं होगा, लेकिन @SerializedName एनोटेशन पर दिखेगा।

+0

बढ़िया! यह काम करता है! धन्यवाद – padeoe

+0

यह उत्तर WAAAAY को खोजने में लंबा लगा। अच्छी तरह से किया @Egor एन – Silmarilos

+0

बहुत बहुत धन्यवाद !!!! –

-1

निम्नलिखित करने के लिए अपने json कोड बदलें ..

{ 
"reply_code": "001", 
"userinfo": [ 
    { 
     "username": "002" 
    }, 
    { 
     "userip": "003" 
    } 
    ] 
} 

अब json पार्स करने के लिए प्रयास करें ...

10

आप @SerializedName उपयोग कर सकते हैं के रूप में @Egor एन ने उल्लेख किया है या आप

-keep class com.packageName.yourGsonClassName 

बाद पूर्व से अधिक निम्न लाभ हैं का उपयोग करके proguard-rules.pro को Gson कक्षाएं जोड़ सकते हैं:

  • अपना कोड लिखते समय आप अपने सभी जीसन क्लास को एक फ़ोल्डर में रख सकते हैं और उन सभी को निम्नलिखित का उपयोग करके obfuscation से रोक सकते हैं, जो बहुत सारे कोडिंग को बचाता है:

    -keep class com.packageName.gsonFolder.** { *; } 
    
  • Gson कक्षाओं में प्रत्येक क्षेत्र के लिए @SerializedName जोड़ना है न केवल समय लेने वाली विशेष रूप से Gson फ़ाइलों के बहुत सारे के साथ बड़ी परियोजनाओं में बल्कि कोड दर्ज गलतियों की संभावना बढ़ जाती है, अगर @SerializedName में तर्क से अलग है कार्यक्षेत्र नाम।

  • यदि कोई अन्य विधियां, जैसे गेटर्स या सेटर विधियों का उपयोग जीसन वर्ग में किया जाता है, तो वे भी परेशान हो सकते हैं। इन तरीकों के लिए @SerializedName का उपयोग नहीं करना नामों में संघर्ष के कारण रनटाइम में क्रैश का कारण बनता है।

+0

बहुत अच्छा मुद्दा। धन्यवाद। –

+0

मेरे लिए, यह अतिरिक्त जानकारी ** निजी फ़ील्ड ** जोड़ने के बाद काम करता है ** - रखरखाव वर्ग com.packageName.yourGsonClassName { निजी ; } –

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