由于非法属性名称,无法使用 gson API 将 json 文件转换为对象列表
Cannot convert json file to list of objects using gson API caused by an illegal attribute's name
考虑这个 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 文件转换为对象列表,我创建了这些 classes 但我遇到了由非法属性名称引起的问题
标识符class:(这里所有的属性都有一个正确的名字)
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 class: (这里的问题是因为这个变量名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:(这里没问题)
class Data {
String permalink;
Pecas pecas;
// getters, setters, toString...
}
据我所知,为了使用 Gson API
将此 json 文件转换为 Data
对象的列表,上述嵌套的所有属性 classes 必须根据 json 文件字段命名(就像我上面做的那样)。
所以我的问题来了:我能否将这个非法属性名称 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 文件中的任何内容。
借用How to parse with GSON when identifier has space in name的助攻。我对 Gson 不是很熟悉,但像这样的东西应该可以解决问题。我已经测试了很多并且有效:
class:
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);
}
考虑这个 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 文件转换为对象列表,我创建了这些 classes 但我遇到了由非法属性名称引起的问题
标识符class:(这里所有的属性都有一个正确的名字)
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 class: (这里的问题是因为这个变量名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:(这里没问题)
class Data {
String permalink;
Pecas pecas;
// getters, setters, toString...
}
据我所知,为了使用 Gson API
将此 json 文件转换为 Data
对象的列表,上述嵌套的所有属性 classes 必须根据 json 文件字段命名(就像我上面做的那样)。
所以我的问题来了:我能否将这个非法属性名称 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 文件中的任何内容。
借用How to parse with GSON when identifier has space in name的助攻。我对 Gson 不是很熟悉,但像这样的东西应该可以解决问题。我已经测试了很多并且有效:
class:
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);
}