java Gson:无法为类调用无参数构造函数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12927097/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Gson : Unable to invoke no-args constructor for class
提问by Raveesh Sharma
Although there are several threads on this topic.. please do not mark this as duplicate.
虽然有关于这个主题的几个线程......请不要将其标记为重复。
My pojo looks like this :
我的 pojo 看起来像这样:
public class sample {
public sample() {
// TODO Auto-generated constructor stub
}
private String instructions;
private String resource;
private List<Map<String,String>> fields;
private String taskid;
private List<Map<String,String>> answer;
public String getTaskid() {
return taskid;
}
public void setTaskid(String taskid) {
this.taskid = taskid;
}
public String getInstructions() {
return instructions;
}
public void setInstructions(String instructions) {
this.instructions = instructions;
}
public String getResource() {
return resource;
}
public void setResource(String resource) {
this.resource = resource;
}
public List<Map<String,String>> getFields() {
return fields;
}
public void setFields(List<Map<String,String>> fields) {
this.fields = fields;
}
public List<Map<String,String>> getAnswer() {
return answer;
}
public void setAnswer(List<Map<String,String>> answer) {
this.answer = answer;
}
}
I am doing a httpget and the result is an array of Json objects I try to typecast it to sample but it gives an exception.
我正在做一个 httpget,结果是一个 Json 对象数组,我尝试将它类型转换为样本,但它给出了一个例外。
the deserialization snippet is as follows
反序列化片段如下
sample[] temp = gsonObj.fromJson(response, sample[].class);
the exception i get is
我得到的例外是
java.lang.RuntimeException: Unable to invoke no-args constructor for class [sample;. Register an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.MappedObjectConstructor.constructWithAllocators(MappedObjectConstructor.java:68)
at com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:52)
at com.google.gson.JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:42)
at com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:60)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:104)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:76)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:54)
at com.google.gson.Gson.fromJson(Gson.java:551)
at com.google.gson.Gson.fromJson(Gson.java:498)
at com.google.gson.Gson.fromJson(Gson.java:467)
at com.google.gson.Gson.fromJson(Gson.java:417)
at com.google.gson.Gson.fromJson(Gson.java:389)
at HTTPClientUtils.getResultsFromMobileWorks(HTTPClientUtils.java:327)
Can you please let me know where i am making the mistake ??
你能告诉我我在哪里犯了错误吗??
采纳答案by Nishant
Can't reproduce. But here what works:
无法重现。但这里有什么工作:
public class Sample {
public Sample(){}
public int kk;
public List<Map<String,String>> fields;
public static void main(String[] args) {
String s = "[{\"kk\":1, \"fields\":[{\"a\":\"a1\"}]}, {\"kk\":5}, {\"kk\":2}, {\"kk\":8}, {\"kk\":6, \"fields\":[{\"b\":\"b1\"}]}]";
Sample[] r = new Gson().fromJson(s, Sample[].class);
for(Sample t: r)
System.out.println(">> " + t.kk + " " + t.fields);
}
}
results:
结果:
>> 1 [{a=a1}]
>> 5 null
>> 2 null
>> 8 null
>> 6 [{b=b1}]
Sidenote:
边注:
- Capitalize your classes, always.
- post a sscce
- 始终将您的课程大写。
- 发帖
回答by paul
You have to use TypeToken
class from Google.
You will need of course has a generic class T
to make it works, like below:
你必须使用TypeToken
谷歌的课程。
您当然需要一个通用类T
来使其工作,如下所示:
Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
gson.fromJson(json, fooType);