2010-11-23 4 views
0

Я пытаюсь десериализовать json строку с помощью gson. В то время как gson.fromJson я получаю следующее сообщение об ошибке:gson -> «Конструктор no-args для класса xyz» с массивами

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

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

JSON Строка

[ 
{ 
    "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(); 
     } 

считает Крис

ответ

2

Попробуйте сделать свой конструктор общественности, так что 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 = ""; 
} 

Update:

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

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

+0

все тот же. когда я десериализую не на Лицензии [], а на Лицензии и помещаю только один объект в строку json, он работает. даже без публичного конструктора – 2010-11-23 08:15:30

+0

Почему вы используете `j = новый JSONObject (JSONSerializedResources)`? – 2010-11-23 09:12:07

0

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

теперь я попробовал это не так

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

но прямо так

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

с моей старой оригинальной JSon строки с начальной и конечной "[" & "]"

и он работает

0

Попробуйте удалить конструкторы, если вам не нужно я попытался с помощью два классов класса А, имеющего списка класса В

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