Конструктор без аргументов для класса XXX не существует

1

Я новичок в разработке Android. Здесь я делаю вызов GET как это -

    protected String doInBackground(String... params) {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("email", "[email protected]"));

        JSONHttpClient jsonHttpClient = new JSONHttpClient();
        ProductDetail[] products  = jsonHttpClient.Get(ServiceUrl.PRODUCT, nameValuePairs, ProductDetail[].class);

        return null;
    }

Это вызов GET в файле JSONHttpClient -

 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);

Может ли кто-нибудь помочь в этом?

В моем веб-api я создаю json, как это (proddetails - это объект с С# 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"
   }          
] 
  • 1
    Ваш класс ProductDetail является внутренним классом?
  • 0
    Нет, это не так. На самом деле это единственный класс в системе на данный момент.
Показать ещё 12 комментариев
Теги:

1 ответ

0

Руководство пользователя Gson (https://sites.google.com/site/gson/gson-user-guide) сообщает вам, что класс с хорошим поведением (предназначенный для сериализации и десериализации) должен иметь конструктор аргументов. Если этого не существует, он советует вам использовать InstanceCreator.

Даже если у вас нет конструктора, Gson создаст ObjectConstructor для вашего класса. Но это не всегда безопасно и имеет свои ограничения. Этот вопрос о SO больше вписывается в детали: Обязательный конструктор no-args по умолчанию для Gson?

ПРИМЕЧАНИЕ.. Обратите внимание, что если это внутренний класс, он ДОЛЖЕН иметь конструктор, как описано в документации.

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

  • 0
    Итак, как это исправить в моей ситуации. Это не внутренний класс.
  • 0
    Пожалуйста, смотрите мое редактирование. Вы просто должны добавить конструктор без аргументов
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню