【问题标题】:(Gson) JSON to Java objects containing ArrayList<Class>(Gson) JSON 到包含 ArrayList<Class> 的 Java 对象
【发布时间】:2013-11-10 15:19:48
【问题描述】:

我正在从 Web 服务中检索数据,该服务返回一个带有我的对象的 JSON 表示形式的字符串。发生的情况是,除了其他简单属性之外,我的对象还有两个 ArrayList&lt;&gt; 的其他对象。这似乎是Gson的问题。我一直在寻找,答案与我的具体问题不符。

我的代码基本上是:

动词

public class Verbete implements Serializable{
    private long id;
    private List<NomesVerbete> nomes;
    private List<SignificadosVerbete> significados;
    private int totalAcessos = 0;
    private Date dataLancamento;
    private int relevancia = 0;
    //getters and setters
}

NomesVerbete

public class NomesVerbete implements Serializable {
    private long id;
    private String nome;
    private String etimologia;
    //getters and setters
}

SignificadosVerbete

public class SignificadosVerbete implements Serializable{
    private long id;
    private String significado;
    private CategoriaVerbete categoria;
    //getters and setters
}

CategoriaVerbete

public class CategoriaVerbete implements Serializable{
    private long id;
    private String nome;
    private String descricao;
    private int serie;
    //getters and setters
}

Verbete 到 JSON 的转换给了我这个字符串(这似乎是正确的,对吧?):

{"id":81,"nomes":[{"id":124,"nome":"aleluia","etimologia":"asasiajisjaijs"},{"id":126,"nome":"amém","etimologia":"asasiajisjaijs"}],"significados":[{"id":67,"significado":"asasjaijsiajsoijaoisjaoisj","categoria":{"id":3,"nome":"Nada","descricao":"asuahushaus","serie":1}}],"totalAcessos":0,"dataLancamento":1382066568000,"relevancia":0}

但是,当我尝试将此 JSON 字符串转换为 Verbete 时,它不起作用,但在尝试访问该对象时出现 NullPointerException。这是我从 Json 转换而来的:

Gson gson = new GsonBuilder().create();
Verbete verbete = gson.fromJson(resposta[1], Verbete.class); //resposta[1] is the json string above

请问有人可以给我一个方法来进行这种转换吗? 谢谢。

【问题讨论】:

  • 而异常的堆栈跟踪是?
  • 当我尝试访问“verbete”对象时,LogCat 只显示 NullPointerException。
  • 我严重怀疑。向我们展示重现问题的 SSCCE。
  • 我猜你要么给解析器一个空字符串,要么你实际上并没有检查解析器的结果。
  • 字符串 resposta[1] 实际上有 Json 字符串。如我所见,我的代码应该可以正常工作,对吧?

标签: java json arraylist deserialization gson


【解决方案1】:

这样做

    final String json = "{\"id\":81,\"nomes\":[{\"id\":124,\"nome\":\"aleluia\",\"etimologia\":\"asasiajisjaijs\"},{\"id\":126,\"nome\":\"amém\",\"etimologia\":\"asasiajisjaijs\"}],\"significados\":[{\"id\":67,\"significado\":\"asasjaijsiajsoijaoisjaoisj\",\"categoria\":{\"id\":3,\"nome\":\"Nada\",\"descricao\":\"asuahushaus\",\"serie\":1}}],\"totalAcessos\":0,\"dataLancamento\":1382066568000,\"relevancia\":0}";
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Date.class,
            new JsonDeserializer<Date>() {
                @Override
                public Date deserialize(JsonElement jsonElement, Type type,
                        JsonDeserializationContext context)
                        throws JsonParseException {
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTimeInMillis(jsonElement.getAsLong());
                    return calendar.getTime();
                }
            });
    Gson gson = gsonBuilder.create();
    Verbete verbete = gson.fromJson(json, Verbete.class);

    System.out.println(verbete);

【讨论】:

  • 有趣!有效!那么,问题在于从毫秒转换为 Date 对象?
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
相关资源
最近更新 更多