2015-10-31 145 views
0

我有以下JSON对象,我想使用Google的GSON库反序列化它。不幸的是,我无法正确地获取列表。 GSON找到第一个列表条目,但不是第二个。使用GSON反序列化列表

这是我用来调用代码GSON:

Mentions result = gson.fromJson(response, Mentions.class); 

这里是我的JSON文件:

{ 
    "mentions": [ 
     { 
      "allEntities": [ 
       { 
        "kbIdentifier": "YAGO:Bob_Dylan", 
        "disambiguationScore": "0.63692" 
       } 
      ], 
      "name": "Dylan", 
      "bestEntity": { 
       "kbIdentifier": "YAGO:Bob_Dylan", 
       "disambiguationScore": "0.63692" 
      } 
     }, 
     { 
      "name": "Duluth", 
      "bestEntity": { 
       "kbIdentifier": "YAGO:Duluth\\u002c_Minnesota", 
       "disambiguationScore": "0.63149" 
      } 
     } 
    ] 
} 

这些都是我所创建的普通Java对象:

public class Mentions { 
    public List<Mention> mentions = new ArrayList<>(); 
} 

public class Mention { 
    @SerializedName("bestEntity") 
    public BestEntity entity; 
    @SerializedName("name") 
    public String name; 
} 

public class BestEntity { 
    @SerializedName("kbIdentifier") 
    public String kbIdentifier; 
    @SerializedName("disambiguationScore") 
    public Double disambiguationScore; 
} 

我也尝试直接反序列化列表,但它只是给了我一个错误,说GSON希望列表启动一个t输入的开始。

Type datasetListType = new TypeToken<Collection<Mention>>() { 
}.getType(); 
List<Mention> mentions = gson.fromJson(response, datasetListType); 
+0

你可以发布你与你想要的结果,结果呢? – Tunaki

+0

难道你不会错过'allEntities'的一些映射吗? –

+0

所有实体均不包含相关信息。真正的JSON文件包含更多不相关的信息,我只是忘记从最小的例子中删除AllEntities。 当然,如果我稍后决定需要AllEntities,我会添加一个映射。 – icehawk

回答

0

试试这个 -

AllEntity.java

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

public class AllEntity { 
    @SerializedName("kbIdentifier") 
    @Expose 
    private String kbIdentifier; 
    @SerializedName("disambiguationScore") 
    @Expose 
    private String disambiguationScore; 
    public String getKbIdentifier() { 
     return kbIdentifier; 
    } 
    public void setKbIdentifier(String kbIdentifier) { 
     this.kbIdentifier = kbIdentifier; 
    } 
    public String getDisambiguationScore() { 
     return disambiguationScore; 
    } 
    public void setDisambiguationScore(String disambiguationScore) { 
     this.disambiguationScore = disambiguationScore; 
    } 
    @Override 
    public String toString() { 
     return "AllEntity [kbIdentifier=" + kbIdentifier 
       + ", disambiguationScore=" + disambiguationScore + "]"; 
    } 
} 

BestEntity.java

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

public class BestEntity { 
    @SerializedName("kbIdentifier") 
    @Expose 
    private String kbIdentifier; 
    @SerializedName("disambiguationScore") 
    @Expose 
    private String disambiguationScore; 
    public String getKbIdentifier() { 
     return kbIdentifier; 
    } 
    public void setKbIdentifier(String kbIdentifier) { 
     this.kbIdentifier = kbIdentifier; 
    } 
    public String getDisambiguationScore() { 
     return disambiguationScore; 
    } 
    public void setDisambiguationScore(String disambiguationScore) { 
     this.disambiguationScore = disambiguationScore; 
    } 
    @Override 
    public String toString() { 
     return "BestEntity [kbIdentifier=" + kbIdentifier 
       + ", disambiguationScore=" + disambiguationScore + "]"; 
    } 
} 

Mention.java

import java.util.ArrayList; 
import java.util.List; 

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

public class Mention { 
    @SerializedName("allEntities") 
    @Expose 
    private List<AllEntity> allEntities = new ArrayList<AllEntity>(); 
    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("bestEntity") 
    @Expose 
    private BestEntity bestEntity; 
    public List<AllEntity> getAllEntities() { 
     return allEntities; 
    } 
    public void setAllEntities(List<AllEntity> allEntities) { 
     this.allEntities = allEntities; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public BestEntity getBestEntity() { 
     return bestEntity; 
    } 
    public void setBestEntity(BestEntity bestEntity) { 
     this.bestEntity = bestEntity; 
    } 
    @Override 
    public String toString() { 
     return "Mention [allEntities=" + allEntities + ", name=" + name 
       + ", bestEntity=" + bestEntity + "]"; 
    } 
} 

Main.java

import com.example.ElemntList; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

public class Main { 
    private static Gson gson; 

    static { 
     gson = new GsonBuilder().create(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     String s = "{\"mentions\":[{\"allEntities\":[{\"kbIdentifier\":\"YAGO:Bob_Dylan\",\"disambiguationScore\":\"0.63692\"}],\"name\":\"Dylan\",\"bestEntity\":{\"kbIdentifier\":\"YAGO:Bob_Dylan\",\"disambiguationScore\":\"0.63692\"}},{\"name\":\"Duluth\",\"bestEntity\":{\"kbIdentifier\":\"YAGO:Duluth\\u002c_Minnesota\",\"disambiguationScore\":\"0.63149\"}}]}"; 
     ElemntList info = gson.fromJson(s, ElemntList.class); 
     System.out.println(info); 
    } 
} 

结果是 -

ElemntList [mentions=[Mention [allEntities=[AllEntity [kbIdentifier=YAGO:Bob_Dylan, disambiguationScore=0.63692]], name=Dylan, bestEntity=BestEntity [kbIdentifier=YAGO:Bob_Dylan, disambiguationScore=0.63692]], Mention [allEntities=[], name=Duluth, bestEntity=BestEntity [kbIdentifier=YAGO:Duluth,_Minnesota, disambiguationScore=0.63149]]]] 
0

您不应该使用您创建的类吗?即提及

gson.fromJson(response, Mentions.class); 

如果我是你,我会映射所有领域,以防万一你需要它,你就错过allEntities