2013-07-01 75 views
4

我知道JSONArrayJSONObject之間的區別。Android JsonArray和JsonObject反序列化

我對將它們解序列化有疑問。

雖然反序列化對象類型Cluster的數組,但我可以通過使用fromJson對象來完成。 相反,在反序列化Topic類型的對象時,我不得不使用JSONParser

有什麼區別?我無法確定何時使用JSONParser

FYI的Cluster類:

package com.example.android_json; 

public class Cluster { 
    public String title; 
    public String stories; 
    public String src; 

    public Cluster() 
    {  
    } 

    public Cluster(String title,String stories,String src) 
    { 
     this.title = title; 
     this.stories = stories; 
     this.src = src; 
    } 
} 

Topic類:

package com.example.news_android_mobile_application_cd; 

import java.util.ArrayList; 
import java.util.List; 
import checkdeck.news.ui_services_java_api.rest.model.MiniCluster; 

public class Topic { 

    public Topic() 
    { 
    } 

    public Topic(String TopicID,String TopicName,ArrayList<MiniCluster> miniCluster,ArrayList<String> clusterid) 
    { 
     topicName = TopicName; 
     topicID = TopicID; 
     clusterList = miniCluster; 
     clusterID = clusterid; 
    } 

    String topicID; 
    String topicName; 
    boolean isMandatory; 
    List<MiniCluster> clusterList = new ArrayList<MiniCluster>(); 
    ArrayList<String> clusterID = new ArrayList<String>(); 
} 

的deserialisation代碼如下 -

對於羣集類:

Gson gson1 = new Gson(); 
Cluster[] clusters = gson1.fromJson(json, Cluster[].class); 

對於主題類:

Gson gson = new Gson(); 
    JsonParser parser = new JsonParser(); 
    JsonObject responseObj = parser.parse(json).getAsJsonObject(); 
    String topicID = responseObj.getAsJsonPrimitive("topicID").getAsString(); 
    String topicName = responseObj.getAsJsonPrimitive("topicName").getAsString(); 
    Boolean isMandatory = responseObj.getAsJsonPrimitive("isMandatory").getAsBoolean(); 
    JsonArray cList = responseObj.getAsJsonArray("clusterList"); 
    JsonArray cID = responseObj.getAsJsonArray("clusterID"); 

    List<MiniCluster> clusterList = new ArrayList<MiniCluster>(); 
    ArrayList<String> clusterID = new ArrayList<String>(); 

    for(int i=0;i<cID.size();i++) 
    { 
     clusterList.add(gson.fromJson(cList.get(i), MiniCluster.class)); 
     clusterID.add(cID.get(i).toString()); 

    } 

The JsonData to be deserialised

在此先感謝。

+4

您可能想要更改您的問題。它含糊不清:您發佈的兩個類與JSON(de-)序列化有什麼關係?你正在使用哪兩種方法(從android庫,從另一個庫,...)? 您可能想要顯示您在嘗試(取消)序列化時使用的代碼。 – Patrick

+1

@Patrick我發佈了兩個類來顯示一個類有原始組件而另一個有ArrayList的區別。所以我懷疑這是否是使用JSONParser的原因。是的,我添加了反序列化代碼。 – viedee

+0

您是否嘗試用'Gson'對「Topic」進行反序列化?另外,如果你將一個樣本json放入問題主體中,它確實會有所幫助。 – Nikhil

回答

1

下面是我用來反序列化json的最小代碼。

package com.foo.examples; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import com.google.gson.Gson; 

public class JsonDeser { 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 
     String jsonStr = JsonManupulation.readFile(System.getProperty("user.dir")+"/topic.json"); 
     Gson gson = new Gson(); 
     Topic topic = gson.fromJson(jsonStr, Topic.class); 
     System.out.println(topic); 

    } 

    public static class RepresentativeStory{ 
     String description,headline; 
    } 

    public static class Cluster{ 
     public String clusterID; 
     public RepresentativeStory representativeStory; 
    } 

    public static class Topic { 
     String topicID; 
     String topicName; 
     boolean isMandatory; 
     List<Cluster> clusterList = new ArrayList<Cluster>(); 
     ArrayList<String> clusterID = new ArrayList<String>(); 
     @Override 
     public String toString() { 
      return new Gson().toJson(this); 
     } 
    } 


} 

文件topic.json包含您所提供的JSON字符串。 爲簡潔起見,我只在RepresentativeStory類中定義了兩個屬性。您必須定義所有屬性;這些類也被定義爲內部類。

而這裏的輸出

{ 
    "topicID": "512ecaf6e4b005fbcd13c681", 
    "topicName": "India", 
    "isMandatory": false, 
    "clusterList": [ 
     { 
      "clusterID": "51c7d3e284ae6383d62480cc", 
      "representativeStory": { 
       "description": "NEW+DELHI%3A+Canadian+e-commerce+platform+provider%2C+Shopify+has+forayed+into+the+Indian+market+in+partnership+with+Singapore%27s+SingTel.+SingTel+will+help+build+ecosystem+which+includes+tying+up+with...", 
       "headline": "E-commerce+platform+provider+Shopify+enters+India" 
      } 
     }, 
     { 
      "clusterID": "51c7d47784ae6383d624821c", 
      "representativeStory": { 
       "description": "MUMBAI%3A+Account+holders+in+rural+banks+and+small+cooperatives+can+now+make+online+purchases+with+the+National+Payment+Corporation+of+India+launching+an+e-commerce+solution+for+its+RuPay+card.+RuPay...", 
       "headline": "RuPay+cards+can+be+used+online" 
      } 
     }, 
     { 
      "clusterID": "51c7d36d84ae6383d6247fc2", 
      "representativeStory": { 
       "description": "WASHINGTON%3A+Those+insidious+email+scams+known+as+phishing%2C+in+which+a+hacker+uses+a+disguised+address+to+get+an+internet+user+to+install+malware%2C+rose+87+per+cent+worldwide+in+the+past+year%2C+a...", 
       "headline": "Phishing+scams+rising+globally%3A+Study" 
      } 
     }, 
     { 
      "clusterID": "51c7d62d84ae6383d6248366", 
      "representativeStory": { 
       "description": "With+India+making+it+clear+that+the+Afghan+reconciliation+process+should+not+lead+to+conferring+legitimacy+to+the+Taliban+and+undermine+the+elected+Afghan+government%2C+the+visiting+US+Secretary+of+Stat...", 
       "headline": "No+pact+if+Taliban+has+Qaeda+links%3A+Kerry" 
      } 
     }, 
     { 
      "clusterID": "51c7d28084ae6383d6247e33", 
      "representativeStory": { 
       "description": "Palestinian+president+Mahmud+Abbas+on+Sunday+formally+accepted+the+resignation+of+his+newly-installed+prime+minister+Rami+Hamdallah....", 
       "headline": "President+Abbas+accepts+resignation+of+PM%3A+source" 
      } 
     }, 
     { 
      "clusterID": "51c7d51a84ae6383d62482e1", 
      "representativeStory": { 
       "description": "With+land+being+acquired+in+Imphal%2C+Manipur+is+set+to+get+its+first+international+airport....", 
       "headline": "Eye+on+SE+Asia%2C+Manipur+set+to+get+first+international+airport" 
      } 
     }, 
     { 
      "clusterID": "51c7d39184ae6383d624800e", 
      "representativeStory": { 
       "description": "The+state+government+may+declare+mangroves+as+%E2%80%9Creserved+forests%E2%80%9D.+Currently%2C+mangroves+on+government+land+are+deemed+%E2%80%9Cprotected+forests%E2%80%9D+while+those+on+private+land+are+%E2%80%9Cforests%E2%80%9D....", 
       "headline": "Mangroves+in+Maharashtra+may+get+status+of+%E2%80%98reserved+forests%E2%80%99" 
      } 
     }, 
     { 
      "clusterID": "51c7d38084ae6383d6247fe8", 
      "representativeStory": { 
       "description": "NEW+DELHI%3A+Starting+June+21%2C+you+can+pay+your+passport+processing+fees+online+and+book+an+appointment+with+the+passport+office.+Making+passport+services+a+timely%2C+transparent%2C+more+accessible+and...", 
       "headline": "Now%2C+pay+pay+passport+fees+online" 
      } 
     } 
    ], 
    "clusterID": [ 
     "51c7d3e284ae6383d62480cc", 
     "51c7d47784ae6383d624821c", 
     "51c7d36d84ae6383d6247fc2", 
     "51c7d62d84ae6383d6248366", 
     "51c7d28084ae6383d6247e33", 
     "51c7d51a84ae6383d62482e1", 
     "51c7d39184ae6383d624800e", 
     "51c7d38084ae6383d6247fe8" 
    ] 
} 

你可以即興此代碼爲您的需求!

+0

非常感謝@Nikhil爲我的問題花費寶貴的時間。還有一個問題,你告訴我將類定義爲內部類,但是我直接從它們已經定義的jar文件中使用它們。那麼,如果我不讓它們變得內在,那麼它可以嗎? – viedee

+0

不客氣!我希望這有幫助。 – Nikhil

+0

如果你有更多的空閒時間,你能告訴我什麼是使用JSONParser的需要或優勢?在此先感謝:) – viedee