类XXX不存在任何args构造函数



我是Android开发的新手。在这里,我正在打这样的GET电话-

    protected String doInBackground(String... params) {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("email", "guest@example.com"));
        JSONHttpClient jsonHttpClient = new JSONHttpClient();
        ProductDetail[] products  = jsonHttpClient.Get(ServiceUrl.PRODUCT, nameValuePairs, ProductDetail[].class);
        return null;
    }

这是JSONHttpClient文件-中的GET调用

 public <T> T Get(String url, List<NameValuePair> params, final Class<T> objectClass) {
    DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
    String paramString = URLEncodedUtils.format(params, "utf-8");
    url += "?" + paramString;
    HttpGet httpGet = new HttpGet(url);

        httpGet.setHeader("Accept", "application/json");
        httpGet.setHeader("Accept-Encoding", "gzip");
        httpGet.setHeader("Authorization", "Bearer <code>");
        HttpResponse httpResponse = defaultHttpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        if (httpEntity != null) {
            InputStream inputStream = httpEntity.getContent();
            Header contentEncoding = httpResponse.getFirstHeader("Content-Encoding");
            if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
                inputStream = new GZIPInputStream(inputStream);
            }
            String resultString = convertStreamToString(inputStream);
            inputStream.close();
            return new GsonBuilder().create().fromJson(resultString, objectClass);
        }
    return null;
}

这是我的ProductDetail

public class ProductDetail {
    public int Id;
    public String Name;
}

在运行这个,我得到以下错误-

No-args constructor for class com.compa.ProductDetail does not exist. Register an InstanceCreator with Gson for this type to fix this problem.

这是在JSONHttpClient文件-中的这一行引发的

return new GsonBuilder().create().fromJson(resultString, objectClass);

有人能帮忙吗?

在我的web api中,我创建了这样的json(prodfdetails是一个C#IEnumerable对象)-

json = JsonConvert.SerializeObject(proddetails);
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return response;

响应json的结构是-

[
   {
       "Id": 1,
       "Name": "First"
   },
   {
       "Id": 2,
       "Name": "Second"
   }          
] 
Gson用户指南(https://sites.google.com/site/gson/gson-user-guide)告诉一个行为良好的类(用于序列化和反序列化)应该有一个无参数构造函数。如果没有,它建议您使用InstanceCreator。

即使您没有构造函数,Gson也会为您的类创建一个ObjectConstructor。但这并不总是安全的,也有其自身的局限性。这个关于SO的问题更详细:Gson是否必须使用默认的无args构造函数?

注意:请注意,如果这是一个内部类,那么它必须有一个构造函数,如文档中所述。

EDIT:您的json是一个数组。因此,您需要在包含类中拥有指定数量的数组对象。因此,您可以执行以下操作,然后进行投射:

public class ProductDetailArray {
    public ProductDetailArray[] array;
    public static ProductDetail {
        public ProductDetail() {} // You can also make the constructor private if you don't want anyone to instantiate this
        public int Id;
        public String Name; 
    }
}

一旦你像以前一样抛出json:

ProductDetailArray obj = GsonBuilder.create().fromJson(response, ProductDetailArray.class);
ProductDetail one = obj.array[0];
ProductDetail two = obj.array[1];

然后你就可以操作了。。此外,您可能应该使用Gson.fromJson(),而不是GsonBuilder

最新更新