我遇到了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
}
}
]
答案 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;
}
}