使用salt-net-api进行Gson解析错误

时间:2016-11-12 01:31:26

标签: json gson salt

尝试解析Salt CherryPy REST接口的输出。 Json的提供如下,

{"info": [{"Function": "cmd.run", "jid": "20161111182415841377", "Target": "yesMyMaster", "Target-type": "glob", "User": "saltdev", "StartTime": "2016, Nov 11 18:24:15.841377", "Arguments": ["echo HELLO"], "Minions": ["yesMyMaster"], "Result": {}}], "return": [{}]}

这会导致以下错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 147 path $.info[0].StartTime

at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.Gson.fromJson(Gson.java:887)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)

代码很简单,没什么特别的。

    Gson gson = new Gson();

    ResultInfoSet resultInfos = gson.fromJson(json, ResultInfoSet.class);

ResultInfo是Salt-Net-Api

中的一个类

在使用Gson之前,有没有人遇到过类似的错误?

更新

如果我从json中删除"StartTime": "2016, Nov 11 18:24:15.841377",那么Gson工作正常。

2 个答案:

答案 0 :(得分:1)

您必须使用库所使用的相同类型的适配器。 您可以找到完整的示例here

答案 1 :(得分:0)

如下所述设置日期格式,并在POJO类中将字段定义为日期。

Gson gson = new GsonBuilder()
                .setDateFormat("yyyy, MMM dd HH:mm:ss.SSSSSS") 
                .setPrettyPrinting()
                .create();

POJO中的字段定义: -

@SerializedName("StartTime")
    private Date startTime;