【问题标题】:Cannot convert json file to list of objects using gson API caused by an illegal attribute's name由于非法属性名称,无法使用 gson API 将 json 文件转换为对象列表
【发布时间】:2015-05-07 19:47:34
【问题描述】:

考虑这个 json 文件 example.json

[
  {
    "permalink": "c8635076fa371e7642e6e284cc9b60dc",
    "pecas": {
      "1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-": {
        "id": "6a082df27f9fe4be184d7222b79c2f8a",
        "path": "p-554ba68ce4b04befa5148ae4/conteudo/08039a5f3ea1924ed7950bc0caf434a2.swf",
        "nome": "Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-.swf",
        "pathOriginal": "1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-.swf",
        "imagem": "p-554ba68ce4b04befa5148ae4/conteudo/d8c6b07bebf7df2c894c6b6ddaa35bbb.gif"
      }
    }
  }
]

为了将这个 json 文件转换为对象列表,我创建了这些类,但是我遇到了一个由非法属性名称引起的问题

标识符类:(这里所有属性都有一个正确的名称)

class Identifier {
    String id;
    String path;
    String nome;
    String pathOriginal;
    String imagem;
    @Override
    public String toString() {
        return "[ " + id + " , " + path + " , " + nome + " , " + pathOriginal
                + " , " + imagem + " ]";
    }
    // getters, setters,...
}

Pecas 类:(问题出在这个变量名1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-

class Pecas {
    Identifier 1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-;
// Of course this is will not compile
// getters, setters, toString..
}

数据类:(这里没问题)

class Data {
    String permalink;
    Pecas pecas;
    // getters, setters, toString...
}

据我所知,为了使用Gson API将此json文件转换为Data对象的列表,上述嵌套类中的所有属性都必须根据json文件的'fields(就像我上面做了)。

所以我的问题来了:我可以将这个非法属性名称 1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_- 更改为另一个 identifier 以便我可以这样做

Gson gson = new Gson();
List<Data> list = gson.fromJson(new BufferedReader(new FileReader(
        "example.json")), new TypeToken<List<Data>>() {
}.getType());

Identifier id = list.get(0).getPecas().getIdentifier();
System.out.println(id);

输出会是

[ 6a082df27f9fe4be184d7222b79c2f8a , p-554ba68ce4b04befa5148ae4/conteudo/08039a5f3ea1924ed7950bc0caf434a2.swf , Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-.swf , 1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-.swf , p-554ba68ce4b04befa5148ae4/conteudo/d8c6b07bebf7df2c894c6b6ddaa35bbb.gif ]

或者也许还有其他解决方案? (比如使用annotation 或类似的东西......)

注意:我无法更改 json 文件中的任何内容。

【问题讨论】:

标签: java json gson


【解决方案1】:

借用How to parse with GSON when identifier has space in name的助攻。我对 Gson 不是很熟悉,但是这样的事情应该可以解决问题。我已经测试了很多并且它有效:

类:

import com.google.gson.annotations.SerializedName;
public class Identifier {
     @SerializedName("1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-") public String key;
}

测试方法:

public static void main(String[] args) {
    String json = "{'1401 Pecas Midia Grafica_v2/Whirlpool_LinhaBranca_Positivo_CanaisdeAfinidade_SuperBanner_-':'some value'}";
    Identifier id = new Gson().fromJson(json, Identifier.class);
    System.out.println(id.key);
}

【讨论】:

  • 哇超级天才+1并接受了答案,它工作得很好。但我仍然不明白为什么他们对我的问题投了反对票。有那么糟糕而且没有建设性吗?
  • 就个人而言,我对您的问题的疑问是我发现您的作品集相当难以理解。但是,我很清楚您遇到了什么问题以及您遇到的问题。因此,我将其简化为我提供给您的版本。我没有对你投反对票,仅供参考。
  • 既然您现在有了解决方案,就让它保持原样吧。不值得花更多时间在上面。将来,请考虑仅显示您遇到问题的最相关的代码段。我链接到的问题就是一个很好的例子。
  • 这仅适用于这个实例,这对于任何其他包含任何其他数据的文件都不是有效的解决方案,这是一个非答案,因为特定实例的数据被硬编码到注释中
猜你喜欢
  • 2011-01-23
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2018-10-14
相关资源
最近更新 更多