【问题标题】:GSON: Using fromJson to convert a list of dictionariesGSON:使用 fromJson 转换字典列表
【发布时间】:2017-11-05 16:24:34
【问题描述】:

我目前正在尝试使用 GSON 从下面显示的 last.fm API 中提取名称“Best I Ever Had”,但在不断返回空值时遇到了困难。

******************************编辑****************** *************

这是 JSON,曲目是字典列表,每个歌曲名称对应一个:

{
toptracks: {
   track: [
        {
          name: "Best I Ever Had"
        }
   ]
}
}

使用http://www.jsonschema2pojo.org/ 我创建了以下类:

TrackName.java

package com.webservice1;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class TrackName {

@SerializedName("toptracks")
@Expose
private Toptracks toptracks;

public Toptracks getToptracks() {
    return toptracks;
}

public void setToptracks(Toptracks toptracks) {
    this.toptracks = toptracks;
}

public TrackName withToptracks(Toptracks toptracks) {
    this.toptracks = toptracks;
    return this;
}

}

Toptracks.java

package com.webservice1;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Toptracks {

@SerializedName("track")
@Expose
private List<Track> track = null;

public List<Track> getTrack() {
    return track;
}

public void setTrack(List<Track> track) {
    this.track = track;
}

public Toptracks withTrack(List<Track> track) {
    this.track = track;
    return this;
}

}

最后是 Track.java

package com.webservice1;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Track {

@SerializedName("name")
@Expose
private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Track withName(String name) {
    this.name = name;
    return this;
}

}

这是我使用 fromJson 方法的代码,其中回复包含整个 JSON,并且一直是“跟踪名称 com.webservice1.Toptracks@1b9e1916”

        String reply;

        reply = reader.readLine();

        Gson gson = new Gson();
        TrackName response = gson.fromJson(reply, TrackName.class);

        System.out.println("Track Name " + response.getToptracks());

任何帮助将不胜感激!

【问题讨论】:

  • 好吧,PopularTrack 根本不匹配您的 JSON 对象的结构。 JSON 对象有一个名为 toptracks 的属性,它是一个具有名为 track 的属性的对象,它是一个具有 name 属性的对象数组。 PopularTrack 根本不匹配。它只有一个名字。所以它可以用来映射一个类似于{ "name": "foo" }的JSON。
  • 可以使用jsonschema2pojo.org生成propper对象结构
  • 如何创建一个与我的 JSON 对象匹配的类?
  • JSON 有一个 toptracks 属性。所以你需要在你的顶级课程中使用它。它的值是 JSON 中的一个对象。所以你创建另一个类来建模这个对象。 toptracks JSON 对象有一个名为 track 的数组。因此,您将轨道属性添加到第二个类。该数组包含对象。所以你创建了第三个类来为这第三种 JSON 对象建模。
  • 请查看使用jsonschema2pojo.org编辑的代码。我现在的问题是它没有输出“我曾经拥有过的最好的”。你知道我哪里出错了吗?

标签: java json rest api gson


【解决方案1】:

您可以使用Jackson 执行此操作,我确信有一些设置可以忽略缺失的字段等...

这是库的 maven 依赖项

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.2</version>
</dependency>

    String json = "{\n"
            + "  \"toptracks\" : {\n"
            + " \"track\": [{\n"
            + "     \"name\": \"Best I Ever Had\",\n"
            + "     \"playcount\": \"3551414\",\n"
            + "     \"listeners\": \"1058277\",\n"
            + "     \"mbid\": \"00bde944-7562-446f-ad0f-3d4bdc86b69f\",\n"
            + "     \"url\": \"https://www.last.fm/music/Drake/_/Best+I+Ever+Had\",\n"
            + "     \"streamable\": \"0\",\n"
            + "     \"artist\": {\n"
            + "         \"name\": \"Drake\",\n"
            + "         \"mbid\": \"b49b81cc-d5b7-4bdd-aadb-385df8de69a6\",\n"
            + "         \"url\": \"https://www.last.fm/music/Drake\"\n"
            + "     }\n"
            + " }]\n"
            + "}\n"
            + "}";

    ObjectMapper mapper = new ObjectMapper();

    TopTracks track = mapper.readValue(json, TopTracks.class);

    List<Object> trackList = (List<Object>)track.toptracks.get("track");

    Map<String, Object> trackMap = (Map<String, Object>) trackList.get(0);

    System.out.println(trackMap.get("name"));

public class TopTracks {

    public Map<String, Object> toptracks = new HashMap<>();
}

输出:

--- exec-maven-plugin:1.2.1:exec (default-cli) @ MVN ---
Best I Ever Had
------------------------------------------------------------------------
BUILD SUCCESS

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2021-10-13
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多