gpt4 book ai didi

java - Json Gson 绑定(bind)不起作用(异常对象/字符串)

转载 作者:行者123 更新时间:2023-12-02 00:25:57 28 4
gpt4 key购买 nike

我在将从数据库获取的 JSON 解析到 Java (Android) 应用程序时遇到一些问题。我希望你能帮助我:

这是我的 Json:

<br>
[{<br>
"ID" : "1",<br>
"name" : "Test name",<br>
"type" : "1",<br>
"Desc" : "blablabla",<br>
"minNum" : "0",<br>
"maxNum" : "12",<br>
"Num" : "8",<br>
"bool1" : "0",<br>
"bool2" : "1",<br>
"bool3" : "1",<br>
"date" : "2012-04-01 23:00:00",<br>
"double1" : "39.47208",<br>
"doubl2" : "-0.3556063",<br>
"someText" : "ajayeah",<br>
"number" : "15",<br>
"anotherNumber" : "1234"<br>
}, {"ID" : "2",<br>
"name" : "Test name",<br>
"type" : "1",<br>
"Desc" : "blablabla",<br>
"minNum" : "0",<br>
"maxNum" : "12",<br>
"Num" : "8",<br>
"bool1" : "0",<br>
"bool2" : "1",<br>
"bool3" : "1",<br>
"date" : "2012-04-01 23:00:00",<br>
"double1" : "39.47208",<br>
"doubl2" : "-0.3556063",<br>
"someText" : "ajayeah",<br>
"number" : "15",<br>
"anotherNumber" : "1234"<br>
}]<br>

(这些名字显然不是我在这里写的:P)

我将所有这些都作为字符串(选中,确定),例如在名为responseString的变量中;

然后我尝试了所有可能的方法来进行转换,但总是失败。我试图将其作为一个对象来删除 '[' ']',作为一个数组(我实现了但此行失败了):

MyClassList MyClas = new Gson().fromJson(responseString, MyClassList.class);

错误是:

com.google.gson.JsonSyntaxException: 
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY

(其他测试首先将其转换为对象或数组,错误在于 BEGIN_STRING)

可能是因为我使用的是 boolean 值和日历类型(日期)并且 Gson 库不支持它?

好吧,我希望你能带我离开这里,因为我快疯了。

谢谢:)

<小时/>

不要使用日历,这是我的问题。相反,您可以使用 Date 并且它可以工作。另外,我不知道为什么,像“0”|“1”这样的 boolean 值不起作用。就像“true”|“false”是的。

最佳答案

最后,我知道这是我的第三个答案,但正如您所看到的,由于日历的原因,问题非常复杂,存在多个答案。

使用 GSON 不能开箱即用。出于前面所述的原因,我强烈建议放弃日历并转向 JODA。

您正在处理的问题是日期的序列化问题。幸运的是,GSON 允许您为此目的注册自定义序列化器(不使用自己的解析器的另一个原因)。您可以为日历编写一个或查找已经编写的日历。

值得庆幸的是,这已经为 JODA DateTimes 完成了,并为那些想要编写自己的日期时间的人提供了蓝图。

请参见此处:https://sites.google.com/site/gson/gson-type-adapters-for-common-classes

我是这样实现的:

package com.techtrip.test;

import java.lang.reflect.Type;

import org.joda.time.DateTime;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class DateTimeTypeConverter implements JsonSerializer<DateTime>, JsonDeserializer<DateTime> {
// No need for an InstanceCreator since DateTime provides a no-args constructor
@Override
public JsonElement serialize(DateTime src, Type srcType, JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
@Override
public DateTime deserialize(JsonElement json, Type type, JsonDeserializationContext context)
throws JsonParseException {
return new DateTime(json.getAsString());
}
}

完美,所以现在您所要做的就是向 GSON 构建器注册它,并将其作为目标类的替代品(在本例中为 DateTime.class)。因此,这将使用此类序列化每个 DateTime。确实非常出色。

使用方法如下:

public static void main(String[] args) {
// TODO Auto-generated method stub

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(DateTime.class, new DateTimeTypeConverter());

Gson gson = gsonBuilder.create();
String jsonStr = gson.toJson(target);

logger.info(String.format("Target As String\n: %s", jsonStr));

// This will work as well --> ToSerialize test[] =
// gson.fromJson(jsonStr, target.getClass());
ToSerialize test[] = gson.fromJson(jsonStr, ToSerialize[].class);

for (ToSerialize deserialized : test) {
logger.info(String.format("From JSON\n: %s",
deserialized.toString()));
}

String testString = "[{\"ID\" : \"1\",\"name\" : \"Test name\",\"type\" : \"1\",\"Desc\" : \"blablabla\",\"minNum\" : \"0\",\"maxNum\" : \"12\",\"Num\" : \"8\",\"bool1\" : \"0\",\"bool2\" : \"1\",\"bool3\" : \"1\",\"date\" : \"2012-04-08T07:50:01.600-05:00\",\"double1\" : \"39.47208\",\"doubl2\" : \"-0.3556063\",\"someText\" : \"ajayeah\",\"number\" : \"15\",\"anotherNumber\" : \"1234\"}, {\"ID\" : \"2\",\"name\" : \"Test name\",\"type\" : \"1\",\"Desc\" : \"blablabla\",\"minNum\" : \"0\",\"maxNum\" : \"12\",\"Num\" : \"8\",\"bool1\" : \"0\",\"bool2\" : \"1\",\"bool3\" : \"1\",\"date\" : \"2012-04-08T07:50:01.600-05:00\",\"double1\" : \"39.47208\",\"doubl2\" : \"-0.3556063\",\"someText\" : \"ajayeah\",\"number\" : \"15\",\"anotherNumber\" : \"1234\"}]";

ToSerialize test2[] = gson.fromJson(testString, ToSerialize[].class);

for (ToSerialize deserialized : test2) {
logger.info(String.format("From JSON\n: %s",
deserialized.toString()));
}
}

有一些警告,您必须弄清楚这一点。首先,您必须包含完全限定的日期时间格式,例如 2012-04-08T07:50:01.600-05:00

其次,您需要一个 DateTimeFormatter(例如 JODA 提供的许多)来打印这些内容。如果您愿意,您还可以从 JODA 获取日历。

我确信通过一些工作也可以为 Java 的日历完成此操作。有人可能已经解决了这个问题。祝你好运!

关于java - Json Gson 绑定(bind)不起作用(异常对象/字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10055127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com