当前位置: 首页 > 面试题库 >

反序列化带有多个项目的JSON对象

盖锐
2023-03-14
问题内容

我正在尝试反序列化(使用gson)如下所示的JSON对象:

        "attachments": {
            "40": {
                "ID": 40,
                "URL": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/wreckit.jpg",
                "guid": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/wreckit.jpg",
                "mime_type": "image\/jpeg",
                "width": 287,
                "height": 400
            },
            "3": {
                "ID": 3,
                "URL": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/frankenweenie2bposter.jpg",
                "guid": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/frankenweenie2bposter.jpg",
                "mime_type": "image\/jpeg",
                "width": 273,
                "height": 400
            }
    },

我该如何处理?我什至不知道该怎么称呼-
这里代表了多个“项目”,但这不是一个数组。当我尝试将其反序列化为数组时,程序在“预期的Begin_Array但找到Begin_Object”异常时崩溃。当我尝试将其反序列化为Strong对象时(请参见下面的类),程序将运行,但所有字段均返回null。

这是我尝试将其映射到的类:

class Attachment {
int ID;
String URL;
}

完整的JSON文件可以在这里看到

编辑:已解决。

@Perception的解决方案基本有效。这个“元素”(仍然想知道这个多入口/非数组json元素是什么)被嵌入在一个确实包含数组的更大的json对象中的事实使情况变得复杂。再说一次,这个JSON不是我设计的-
它来自Wordpress REST API,并且(正如@Perception所暗示的那样),我认为我遇到的问题说明了它的设计缺陷-
也就是说,attachments元素应该是一个数组,而不是单个对象。尽管如此,

但是,如果其他任何人需要使用此API对给定站点上所有帖子的查询结果进行反序列化,并且进一步需要访问每个帖子的附件,请按以下步骤操作:

  private class getAll extends AsyncTask <Void, Void, JSONObject> {
    private static final String url = "https://public-api.wordpress.com/rest/v1/sites/drewmore4.wordpress.com/posts/";
    @Override
    protected JSONObject doInBackground(Void... params) {

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);
        httpget.addHeader("accept", "application/json");
        JSONObject returned = new JSONObject();
        HttpResponse response;

        try {
            response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream instream = entity.getContent();
                String result= convertStreamToString(instream);

                returned =new JSONObject(result);                   
                instream.close();
            }
        } 
        catch (ClientProtocolException | IOException | JSONException e) { e.printStackTrace();}

        return returned;
    }

        @Override
    protected void onPostExecute (JSONObject returned){
        Gson gson = new Gson();

//posts is the element within the JSONObject that is an array of post objects
        try {
        JSONArray posts = returned.getJSONArray("posts");

        for (int curr = 0; curr < posts.length(); curr++){
            String s = posts.get(curr).toString();

            Article a = gson.fromJson(s, Article.class);

            JSONObject attachments = new JSONObject(s).getJSONObject("attachments");
            final Iterator<String> keys = attachments.keys();
               while(keys.hasNext()) {
                    final String key = keys.next();
                    a.attached.add(gson.fromJson(attachments.getJSONObject(key).toString(), Attachment.class));
                }   
               stories.add(a);
        }

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

问题答案:

这是一个数据示例,可能 应该 已经序列化为数组,但是没有被序列化。解析它的一种解决方案是JSONObject直接利用Direct。

String json = ...;
final Gson gson = new Gson();

final List<Attachment> attachements = new ArrayList<Attachment>(64);
final JSONObject jsonObj = new JSONObject(json).getJSONObject("attachments");
final Iterator<String> keys = jsonObj.keys();
while(keys.hasNext()) {
    final String key = keys.next();
    attachements.add(gson.fromJson(jsonObj.getJSONObject(key).toString(), Attachment.class);
}

// Do something with attachements

该数据 也被看作是一个地图,ID的对附件。可以这样反序列化:

final String jsonObj = new JSONObject(json).getJSONObject("attachments");
final Gson gson = new Gson();
final Map<String, Attachment> data = gson.fromJson(jsonObj.toString(),
        new TypeToken<Map<String, Attachment>>() {
        }.getType());
final List<Attachment> attachments = new ArrayList<Attachment>(data.values());

这是实际的



 类似资料:
  • 我尝试反序列化json: 我有两个实体: 和 如何使用一个json条目同时反序列化两个实体?以下是使用Jackson ObjectMapper的main摘录: 它解析日期、uuid和数据集,但不能解析具有hmm_subfamily、hmm_evalue和hmm_score值的HmmResult对象:我得到错误:p.getHmmResult():null。(HmmResult hm=ObjMappe

  • 问题内容: 你好亲爱的同事们, 我有一个Garden类,在其中我可以序列化和反序列化多个Plant类对象。如果想将其分配给mein静态方法中的调用变量,则可以进行序列化,但是不能进行反序列化。 反序列化代码: 我的调用代码: 编辑 我有一个空的Pointer异常 @NilsH的解决方案工作正常,谢谢! 问题答案: 如何序列化整个列表呢?无需序列化列表中的每个对象。 如果那不能解决您的问题,请发布有

  • 我有一个杰克逊多态性问题。我想将JSON数据反序列化为多态类型。通过阅读Jackson文档,我可以将JSON数据反序列化为多态类型。不过,我有一个特例。我有一个类结构如下: 注意:类栏除了继承的“类型”字段之外没有任何其他成员变量。 如果我传入上面的json数据,如: 我得到了类似“无法从end_token中反序列化类条”的信息。我相信这是因为JsonTypeInfo和JsonSubTypes注释

  • 问题内容: 我和Jackson有一个问题,我认为应该很容易解决,但是这真使我丧命。 假设我有一个看起来像这样的Java POJO类(假设对我来说是Getters和Setters): 我想将看起来像这样的JSON反序列化为User对象: 杰克逊给了我一些问题,因为用户不是JSON中的第一级对象。我显然可以制作一个具有单个User对象的UserWrapper类,然后使用该对象反序列化,但是我知道必须有

  • 问题内容: 我将大对象数组序列化为jsonhttp响应流。现在,我想一次从流中反序列化这些对象。是否有任何C#库可以让我做到这一点?我看过json.net,但似乎必须立即反序列化对象的完整数组。 澄清:我想一次从流中读取一个json对象并将其反序列化。 问题答案: 为了逐步读取JSON,您需要结合使用和。但是,您不必一定要从阅读器中手动读取所有JSON。您应该能够利用Linq-To-JSONAPI

  • 我试图获取我的Web请求JSON输出并解析它。这是输出 我为这些结果创建了公共课程 当我尝试反序列化Record类并选择名称时,我从RootObject类获得名称。这是我的密码