4

I know the difference between JSONArray and JSONObject.

I have doubt regarding deserialising them.

While deserialising an array of object type Cluster, I could do it by using fromJson object. On the contrary while deserialising an object of type Topic, I had to use JSONParser.

What is the difference ? I can not make out when to use JSONParser.

FYI the Cluster class:

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; 
    }
}

The Topic class:

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>();
}

The deserialisation code is as follows -

For Cluster class :

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

For Topic 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

Thanks in advance.

7
  • 4
    You might want to rephrase your question. It is vague and unclear: What have the two classes you posted got to do with JSON (de-)serialization? Which two methods exactly are you using (from the android library, from another library, ...)? And you might want to show the code you to use in your attempt to (de-)serialize them. Commented Jul 1, 2013 at 11:52
  • 1
    @Patrick I have posted two classes to show the difference that one class has primitive components while another one has ArrayList. So I doubt whether it is the reason to use JSONParser or not. and Yes, I have added the deserialization code. Commented Jul 2, 2013 at 4:04
  • Did you try de-serializing Topic with Gson? Also, it would really help if you put a sample json in the question body. Commented Jul 2, 2013 at 4:56
  • yes @NikhilPatil I tried that out but it did not work out. It gave me a null object. What do you mean by putting sample json ? Commented Jul 2, 2013 at 5:11
  • Ok. By json I meant the actual String that you want to de-serialize Commented Jul 2, 2013 at 5:44

1 Answer 1

1

Here's the minimum code that I used to de-serialize your 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);
        }
    }


}

The file topic.json contains the json string provided by you. For brevity, I have defined only two attributes in RepresentativeStory class. You must define all properties; also the classes are defined as inner classes.

And here's the output

{
    "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"
    ]
}

You could improvise this code for your exact needs!

Sign up to request clarification or add additional context in comments.

4 Comments

Thanks a lot @Nikhil for spending your valuable time on my question. One more question, you have told me to define the class as inner class, but I am using them directly from a jar file in which they have been defined. Then is it okay if I don't make them inner ?
if you get some more spare time, can you tell me what is the need or advantage to use JSONParser ? Thanks in advance :)
One more question, you have told me to define the class as inner class, but I am using them directly from a jar file in which they have been defined. Then is it okay if I don't make them inner ?
@vaibhavidesai Oh no, they should be defined in separate java files or in your case they may reside in external jar files. As I said, for brevity, I made them inner classes. And for your other question, JsonParser is actually the very low level API that you may use only in rare cases (especially when generics are involved). Recommended reading : sites.google.com/site/gson/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.