将json解析为java对象时出错:应为数字,获取字符串
我正在调用一个服务,它以json的形式返回响应,并使用Gson将它们转换为Java对象。在50种情况中有47种情况下,我得到了Java对象,但在其中3种情况下,我得到了以下错误:将json解析为java对象时出错:应为数字,获取字符串,json,gson,Json,Gson,我正在调用一个服务,它以json的形式返回响应,并使用Gson将它们转换为Java对象。在50种情况中有47种情况下,我得到了Java对象,但在其中3种情况下,我得到了以下错误: com.google.gson.JsonSyntaxException: Expecting number, got: STRING at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:304) at com.g
com.google.gson.JsonSyntaxException: Expecting number, got: STRING
at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:304)
at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:293)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.Gson.fromJson(Gson.java:795)
at com.google.gson.Gson.fromJson(Gson.java:761)
at com.google.gson.Gson.fromJson(Gson.java:710)
at com.google.gson.Gson.fromJson(Gson.java:682)
此处可以看到一个失败的json响应:。我的Java bean如下所示:
import java.util.List;
import com.google.gson.annotations.SerializedName;
public class WordSketch{
@SerializedName("Gramrels")
private List<Gramrel> gramrels;
public List<Gramrel> getGramrels(){
return this.gramrels;
}
public void setGramrels(List<Gramrel> gramrels){
this.gramrels = gramrels;
}
public static class Gramrel {
@SerializedName("Words")
private List<Word> words;
private Number count;
private String name;
private Number score;
private Number seek;
public List<Word> getWords(){
return this.words;
}
public void setWords(List<Word> words){
this.words = words;
}
public Number getCount(){
return this.count;
}
public void setCount(Number count){
this.count = count;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public Number getScore(){
return this.score;
}
public void setScore(Number score){
this.score = score;
}
public Number getSeek(){
return this.seek;
}
public void setSeek(Number seek){
this.seek = seek;
}
}
public static class Word {
private Number count;
private Number id;
private String lempos;
private Number score;
private Number seek;
private String word;
public Number getCount(){
return this.count;
}
public void setCount(Number count){
this.count = count;
}
public Number getId(){
return this.id;
}
public void setId(Number id){
this.id = id;
}
public String getLempos(){
return this.lempos;
}
public void setLempos(String lempos){
this.lempos = lempos;
}
public Number getScore(){
return this.score;
}
public void setScore(Number score){
this.score = score;
}
public Number getSeek(){
return this.seek;
}
public void setSeek(Number seek){
this.seek = seek;
}
public String getWord(){
return this.word;
}
public void setWord(String word){
this.word = word;
}
}
}
import java.util.List;
导入com.google.gson.annotations.SerializedName;
公共类字素描{
@序列化名称(“Gramrels”)
私人名单;
公共列表getGramrels(){
返回此.gramrels;
}
公共无效设置gramrels(列表gramrels){
this.gramrels=gramrels;
}
公共静态类Gramrel{
@序列化名称(“文字”)
私人列表词;
私人数字计数;
私有字符串名称;
私人数字分数;
私人号码搜索;
公共列表getWords(){
返回这个单词;
}
公共无效设置字(列出字){
这个单词=单词;
}
公共号码getCount(){
返回这个.count;
}
公共无效集合计数(数字计数){
this.count=计数;
}
公共字符串getName(){
返回此.name;
}
公共void集合名(字符串名){
this.name=名称;
}
公众号getScore(){
返回此.score;
}
公共核心(数字分数){
这个分数=分数;
}
公众号getSeek(){
把这个还给我;
}
公共无效设置搜索(数字搜索){
this.seek=seek;
}
}
公共静态类词{
私人数字计数;
私人号码id;
私有字符串lempos;
私人数字分数;
私人号码搜索;
私有字符串字;
公共号码getCount(){
返回这个.count;
}
公共无效集合计数(数字计数){
this.count=计数;
}
公共编号getId(){
返回此.id;
}
公共无效集合id(编号id){
this.id=id;
}
公共字符串getLempos(){
返回此.lempos;
}
公共无效集合lempos(字符串lempos){
this.lempos=lempos;
}
公众号getScore(){
返回此.score;
}
公共核心(数字分数){
这个分数=分数;
}
公众号getSeek(){
把这个还给我;
}
公共无效设置搜索(数字搜索){
this.seek=seek;
}
公共字符串getWord(){
返回此.word;
}
公共无效设置字(字符串字){
这个单词=单词;
}
}
}
而实际的gson调用是gson.fromJson(json,WordSketch.class)
既然我不知道gson在json的哪一部分失败了,有谁能指出什么是错误的,或者至少告诉我如何(快速)调试
非常感谢,通过观察您的JSON,我意识到一些字段通常有一个数字值,其他时候它们有一个空字符串作为值 例如,响应中的第三个gramrel是:
{
"count": "",
"colbreak": 1,
"name": "unary rels",
"score": "",
"Words": [
{
"count": 6,
"word": "prp_għaċ-",
"name": "prp_għaċ-",
"score": 9.1,
"Words": [ ],
"seek": 2231297
}
],
"seek": 0
},
在你的班级里,你定义了count
和score
类型Number
,格森抱怨道
编辑:我建议您将类中的所有字段都设置为
String
类型,然后您可以根据需要对其进行转换。。。我的意思是,您可以将编写的类用作响应包装类,然后从该响应类创建实际的类
WordSketch ws = gson.fromJson(json, WordSketch.class);
for (Gramrel g in ws.getGramrels) {
Number count = //convert the String into Number...
//etc...
MyGrammel myGrammel = new MyGrammel(count, ...);
}
在本例中,您的
Gramrel
类只是包装响应的临时类,MyGramrel
是您将使用的实际类(具有Number
类型属性的类)…通过观察JSON,我意识到一些字段通常具有数值,其他时候,它们的值为空字符串
例如,响应中的第三个gramrel是:
{
"count": "",
"colbreak": 1,
"name": "unary rels",
"score": "",
"Words": [
{
"count": 6,
"word": "prp_għaċ-",
"name": "prp_għaċ-",
"score": 9.1,
"Words": [ ],
"seek": 2231297
}
],
"seek": 0
},
在你的班级里,你定义了count
和score
类型Number
,格森抱怨道
编辑:我建议您将类中的所有字段都设置为
String
类型,然后您可以根据需要对其进行转换。。。我的意思是,您可以将编写的类用作响应包装类,然后从该响应类创建实际的类
WordSketch ws = gson.fromJson(json, WordSketch.class);
for (Gramrel g in ws.getGramrels) {
Number count = //convert the String into Number...
//etc...
MyGrammel myGrammel = new MyGrammel(count, ...);
}
在本例中,您的
Gramrel
类只是包装响应的临时类,MyGramrel
是您将使用的实际类(具有类型Number
属性的类)…hmm ic。10倍!最好把所有东西都改成字符串,然后我猜,然后解析成一个数字?没错!这正是我在编辑中写的…:)嗯,是的。10倍!最好把所有东西都改成字符串,然后我猜,然后解析成一个数字?没错!这正是我在编辑中写的…:)