Я новичок в разработке 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"
}
]
Руководство пользователя 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
ProductDetail
является внутренним классом?