Android JsonArray和JsonObject反序列化

4

我知道JSONArrayJSONObject之间的区别。

我对它们的反序列化有疑问。

当反序列化对象数组类型Cluster时,我可以使用fromJson对象进行操作。相反地,当反序列化类型为Topic的对象时,我不得不使用JSONParser

它们之间有什么区别?我无法确定何时使用JSONParser

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

以下是反序列化代码:
对于集群类(Cluster class):
    Gson gson1 = new Gson();
Cluster[] clusters = gson1.fromJson(json, Cluster[].class);

对于Topic类:

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

    }
需要反序列化的JsonData 提前致谢。

4
你可能需要重新表达你的问题,因为它很模糊不清。这两个类与JSON(反)序列化有什么关系?你具体使用了哪两种方法(来自Android库、其他库等)?同时,你可能需要展示一下你尝试(反)序列化它们时所使用的代码。 - Patrick
1
@Patrick 我已经发布了两个类来展示一个类具有原始组件而另一个类具有ArrayList的区别。因此,我怀疑是否使用JSONParser是原因。是的,我已经添加了反序列化代码。 - viedee
你尝试使用Gson反序列化“Topic”了吗?如果在问题描述中提供一个JSON示例,那将非常有帮助。 - Niks
是的 @NikhilPatil 我试过了,但没有成功。它给了我一个空对象。你说的“放置示例 JSON”是什么意思? - viedee
好的。通过“json”,我指的是您想要反序列化的实际字符串。 - Niks
显示剩余2条评论
1个回答

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

您可以根据自己的实际需求对此代码进行改编!

非常感谢@Nikhil在我的问题上花费宝贵的时间。还有一个问题,你告诉我将类定义为内部类,但我直接从一个包含它们定义的jar文件中使用它们。那么如果我不将它们定义为内部类,是否可以呢? - viedee
如果你有更多的空闲时间,能否告诉我使用JSONParser的必要性或优势是什么?提前感谢你 :) - viedee
还有一个问题,你告诉我将类定义为内部类,但我直接从一个包含它们定义的jar文件中使用它们。那么如果我不将它们定义为内部类,是否可以? - viedee
@vaibhavidesai 噢,它们应该在单独的Java文件中定义,或者在您的情况下,它们可以驻留在外部jar文件中。正如我所说,为了简洁起见,我将它们制作成内部类。至于您的另一个问题,“JsonParser”实际上是非常低级别的API,只有在罕见的情况下才会使用(特别是涉及泛型时)。推荐阅读:https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples - Niks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接