类YYYY的No-args构造函数:不存在。使用Gson为此类型注册InstanceCreator以解决此问题“

时间:2011-07-13 14:54:01

标签: android json gson

我遇到了Json反序列化的麻烦:

我收到此错误:

“类别类别的No-args构造函数:不存在。请使用Gson注册InstanceCreator以解决此问题”

public class getElements  {

String [] getEl (String url) throws ClientProtocolException, IOException {

    Categoria c = null;
    Categoria[] cArray = null;
    String [] c1Array = null;
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet("http://10.0.2.2:3000/"+url);

    HttpResponse response = client.execute(request);
    HttpEntity entity = response.getEntity();
    String stringa = "{\"categorium\":{\"created_at\":\"2011-06-09T08:57:41Z\",\"c1\":\"rete stradale\",\"updated_at\":\"2011-06-09T08:57:41Z\",\"id\":1}}";

     Gson json=new Gson();
      try{
          cArray=json.fromJson(stringa, Categoria[].class);
          Log.i("ELEMENTO", ""+cArray);
      }catch(JsonParseException e){
          Log.i("error","JsonParseException");
      }

      c1Array = new String[cArray.length];
      for (int i=0; i<cArray.length; i++) {
          c1Array[i] = cArray[i].c1;
      }

    return c1Array;


 }
}

分类:

public class Categoria {
    public String created_at;
    public String c1;
    public String updated_at;
    public int id;

    public Categoria() {
        this.created_at = "";
        this.c1="";
        this.updated_at = "";
        this.id = 0;
    }

}

这是Json。我想将“c1”带入一个String数组,以构建一个片段!

[
    {
        "categorium": {
            "created_at": "2011-06-09T08:57:41Z",
            "c1": "rete stradale",
            "updated_at": "2011-06-09T08:57:41Z",
            "id": 1
        }
    },
    {
        "categorium": {
            "created_at": "2011-06-09T13:50:29Z",
            "c1": "servizi pubblici",
            "updated_at": "2011-06-09T13:50:29Z",
            "id": 2
        }
    },
    {
        "categorium": {
            "created_at": "2011-06-09T13:50:37Z",
            "c1": "illuminazione",
            "updated_at": "2011-06-09T13:50:37Z",
            "id": 3
        }
    },
    {
        "categorium": {
            "created_at": "2011-06-09T13:50:46Z",
            "c1": "inquinamento",
            "updated_at": "2011-06-09T13:50:46Z",
            "id": 4
        }
    },
    {
        "categorium": {
            "created_at": "2011-06-09T13:50:54Z",
            "c1": "vandalismo",
            "updated_at": "2011-06-09T13:50:54Z",
            "id": 5
        }
    },
    {
        "categorium": {
            "created_at": "2011-06-09T13:51:00Z",
            "c1": "abbandono",
            "updated_at": "2011-06-09T13:51:00Z",
            "id": 6
        }
    },
    {
        "categorium": {
            "created_at": "2011-06-15T08:33:17Z",
            "c1": "altro",
            "updated_at": "2011-06-15T08:33:17Z",
            "id": 8
        }
    }
]

1 个答案:

答案 0 :(得分:1)

回答最新版本的问题:

import java.util.Arrays;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    new getElements().getEl();
  }
}

class CategoriumContainer
{
  Categorium categorium;

  @Override
  public String toString()
  {
    return String.format("{CategoriumContainer: categorium=%s}", categorium);
  }
}

class Categorium
{
  public String created_at;
  public String c1;
  public String updated_at;
  public int id;

  @Override
  public String toString()
  {
    return String.format("{%s, %s, %s, %s}", created_at, c1, updated_at, id);
  }
}

class getElements
{
  String[] getEl() throws Exception
  {
    String stringa = "[{\"categorium\":{\"created_at\":\"2011-06-09T08:57:41Z\",\"c1\":\"rete stradale\",\"updated_at\":\"2011-06-09T08:57:41Z\",\"id\":1}}, {\"categorium\":{\"created_at\":\"2011-06-09T13:50:29Z\",\"c1\":\"servizi pubblici\",\"updated_at\":\"2011-06-09T13:50:29Z\",\"id\":2}}, {\"categorium\":{\"created_at\":\"2011-06-09T13:50:37Z\",\"c1\":\"illuminazione\",\"updated_at\":\"2011-06-09T13:50:37Z\",\"id\":3}}, {\"categorium\":{\"created_at\":\"2011-06-09T13:50:46Z\",\"c1\":\"inquinamento\",\"updated_at\":\"2011-06-09T13:50:46Z\",\"id\":4}}, {\"categorium\":{\"created_at\":\"2011-06-09T13:50:54Z\",\"c1\":\"vandalismo\",\"updated_at\":\"2011-06-09T13:50:54Z\",\"id\":5}}, {\"categorium\":{\"created_at\":\"2011-06-09T13:51:00Z\",\"c1\":\"abbandono\",\"updated_at\":\"2011-06-09T13:51:00Z\",\"id\":6}}, {\"categorium\":{\"created_at\":\"2011-06-15T08:33:17Z\",\"c1\":\"altro\",\"updated_at\":\"2011-06-15T08:33:17Z\",\"id\":8}}]";

    Gson json = new Gson();
    CategoriumContainer[] results = json.fromJson(stringa, CategoriumContainer[].class);
    System.out.println(Arrays.toString(results));
    // output:
    // [{CategoriumContainer: categorium={2011-06-09T08:57:41Z, rete stradale, 2011-06-09T08:57:41Z, 1}}, {CategoriumContainer: categorium={2011-06-09T13:50:29Z, servizi pubblici, 2011-06-09T13:50:29Z, 2}}, {CategoriumContainer: categorium={2011-06-09T13:50:37Z, illuminazione, 2011-06-09T13:50:37Z, 3}}, {CategoriumContainer: categorium={2011-06-09T13:50:46Z, inquinamento, 2011-06-09T13:50:46Z, 4}}, {CategoriumContainer: categorium={2011-06-09T13:50:54Z, vandalismo, 2011-06-09T13:50:54Z, 5}}, {CategoriumContainer: categorium={2011-06-09T13:51:00Z, abbandono, 2011-06-09T13:51:00Z, 6}}, {CategoriumContainer: categorium={2011-06-15T08:33:17Z, altro, 2011-06-15T08:33:17Z, 8}}]

    String[] c1Array = new String[results.length];
    for (int i = 0; i < results.length; i++)
    {
      c1Array[i] = results[i].categorium.c1;
    }
    System.out.println(Arrays.toString(c1Array));
    // output: [rete stradale, servizi pubblici, illuminazione, inquinamento, vandalismo, abbandono, altro]

    return c1Array;
  }
}

回答原始版本的问题:

这是Gson针对这种情况发出的可怕错误消息。我建议用它们记录一个问题。

正如在当前版本的问题中发布的那样,问题是您正在尝试将JSON对象反序列化为数组。解决此问题的简单方法是将JSON更改为数组,或将其反序列化为对象。

这是一个将JSON更改为具有数组的示例,并将其他内容更改为我想您要实现的内容。

import java.util.Arrays;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    new getElements().getEl();
  }
}

class Thing
{
  Categoria[] categorium;

  @Override
  public String toString()
  {
    return Arrays.toString(categorium);
  }
}

class Categoria
{
  public String created_at;
  public String c1;
  public String updated_at;
  public int id;

  public Categoria()
  {
    this.created_at = "";
    this.c1 = "";
    this.updated_at = "";
    this.id = 0;
  }

  @Override
  public String toString()
  {
    return String.format("{%s, %s, %s, %s}", created_at, c1, updated_at, id);
  }
}

class getElements
{
  String[] getEl() throws Exception
  {
    String stringa = "{\"categorium\":[{\"created_at\":\"2011-06-09T08:57:41Z\",\"c1\":\"rete stradale\",\"updated_at\":\"2011-06-09T08:57:41Z\",\"id\":1},{\"created_at\":\"2011-07-12T08:57:41Z\",\"c1\":\"asdf fdsa\",\"updated_at\":\"2011-07-12T08:57:41Z\",\"id\":2}]}";

    Gson json = new Gson();
    Thing thing = json.fromJson(stringa, Thing.class);
    System.out.println(thing);
    // output:
    // [{2011-06-09T08:57:41Z, rete stradale, 2011-06-09T08:57:41Z, 1}, {2011-07-12T08:57:41Z, asdf fdsa, 2011-07-12T08:57:41Z, 2}]

    Categoria[] cArray = thing.categorium;

    String[] c1Array = new String[cArray.length];
    for (int i = 0; i < cArray.length; i++)
    {
      c1Array[i] = cArray[i].c1;
    }
    System.out.println(Arrays.toString(c1Array));
    // output: [rete stradale, asdf fdsa]

    return c1Array;
  }
}