gson -> «Конструктор без аргументов для класса xyz» с массивами - PullRequest
0 голосов
/ 23 ноября 2010

Я пытаюсь десериализовать строку json с помощью gson. Пока gson.fromJson получаю следующую ошибку:

Конструктор без аргументов для класса xyz; не существует. Зарегистрируйте InstanceCreator в Gson для этого типа, чтобы решить эту проблему

Я пытался работать с InstanceCreate, но у меня не получилось. Я надеюсь, что вы можете мне помочь.

JSON String

[
{
    "prog": "Name1",
    "name": "Name2",
    "computername": "Name3",
    "date": "2010-11-20 19:39:55"
},
{
    "prog": "Name1",
    "name": "Name2",
    "computername": "Name3",
    "date": "2010-11-20 12:38:12"
}

]

в соответствии с gson я должен вырезать первый и последний символы ("[" и "]") согласно http://www.jsonlint.com/ строка с правильными символами ...:?:

код выглядит так:

    public class License {
   public String prog;
   public String name;
   public String computername;
   public String date;

   public License() {
      this.computername = "";
      this.date = "";
      this.name = "";
      this.prog = "";
       // no-args constructor
   }
}

               String JSONSerializedResources = "json_string_from_above"
           try
         {
              GsonBuilder gsonb = new GsonBuilder();
              Gson gson = gsonb.create();

              JSONObject j;

              License[] lic = null;
              j = new JSONObject(JSONSerializedResources);

              lic = gson.fromJson(j.toString(), License[].class);

               for (License license : lic) {
                  Toast.makeText(getApplicationContext(), license.name + " - " + license.date, Toast.LENGTH_SHORT).show();
            }
         }
         catch(Exception e)
         {
            Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
             e.printStackTrace();
         }

привет Крису

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Попробуйте сделать ваш конструктор общедоступным, чтобы gson мог получить к нему доступ.

public License() {
  this.computername = "";
  this.date = "";
  this.name = "";
  this.prog = "";
  // no-args constructor
}

, но поскольку Java создает конструктор по умолчанию, вы можете просто использовать:

public class License {
    public String prog = "";
    public String name = "";
    public String computername = "";
    public String date = "";
}

Обновление:

Это действительно довольно тривиально: JSONObject ожидает объект Json "{..}".Вы должны использовать JSONArray, который ожидает "[...]".

Я попробовал, и это работает.Вы все равно должны изменить класс License, как указано выше.

0 голосов
/ 27 января 2013

Попробуйте удалить конструкторы, если вам не нужно Я пытался использовать два класса Класс A, имеющий список класса B

Удалил все конструкторы и просто отлично работал для меня.

0 голосов
/ 24 ноября 2010

это невероятно ...

сейчас попробовал не так

j = new JSONObject(JSONSerializedResources);
lic = gson.fromJson(j.toString(), License[].class);

но прямо так

lic = gson.fromJson(JSONSerializedResources, License[].class);

с моей старой исходной строкой json с началом и окончанием "[" & "]"

и это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...