
我使用GSON库解析服务器JSON响应.后端人员有时会告诉我:“由于某种原因,我们无法在JsON中指定变量类型”(旧的PHP,他们不知道如何执行 *** 作,依此类推等等).
GSON喜欢在对象模型中进行强类型化.因此,我无法将Object解析为String.
GSON等待:
{ "service":{ "description":null, "name":"Base", "ID":"4c7a90410529" }}但是得到(空数据):
"service": ""我得到
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1396解析此类响应的最佳实践是什么?
另一个问题:
如何构建对象,它可以识别不时返回的Integer变量为Integer还是String?同样的服务器端问题.
"data": "1"要么
"data": 1我知道-我们应该在Java中使用特定的类型.但是有时候值得做出让步,
谢谢
编辑:
我的解决方案基于Java Developer的答案.
ServiceDeserializer类根据其内部值反序列化每个对象.
public class ServiceDeserializer implements JsonDeserializer<ServiceState>{ @OverrIDe public ServiceState deserialize(JsonElement Json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String name = ""; String uuID = ""; String description = ""; if (Json.isJsonObject()) { JsonObject obj = Json.getAsJsonObject(); if (!obj.get("name").isJsonNull()) { name = obj.get("name").getAsstring(); } if (!obj.get("uuID").isJsonNull()) { uuID = obj.get("uuID").getAsstring(); } if (!obj.get("description").isJsonNull()) { description = obj.get("description").getAsstring(); } } return new ServiceState(name, uuID, description); }}还有我的GSON构造函数,带有用于ServiceState的类型适配器.
Gson gson = new GsonBuilder() .registerTypeAdapter(ServiceState.class, new ServiceDeserializer()) .create();解决方法:
如果您要严格遵守gson,则可以提供一个自定义deserializer.由于我们知道服务是基本Json字符串的一个属性或嵌入在其他属性中,因此我们可以使用反序列化器逐步解析出有问题的组件并相应地处理它们.
public class MyJsonDeserializer implements JsonDeserializer<YourParsedData> { @OverrIDe public YourParsedData deserialize(final JsonElement je, final Type type, final JsonDeserialization Context jdc) throws JsonParseException { final JsonObject obj = je.getAsJsonObject(); //our original full Json string final JsonElement serviceElement = obj.get("service"); //here we provIDe the functionality to handle the naughty element. It seems emtpy string is returned as a JsonPrimitive... so one option if(serviceElement instanceOf JsonPrimitive) { //it was empty do something } return YourParsedData.create(); //provIDe the functionality to take in the parsed data } }自定义解串器的调用方式如下:
final Gson gson = new GsonBuilder().registerTypeAdapter(YourParsedData.class, new MyJsonDeserializer()).create(); gson.fromJson("{service: ''}", YourParsedData.class);我输入了所有这些内容,因此如果我错过一些语法,我深表歉意.
总结以上是内存溢出为你收集整理的java-GSON解析未指定的类型变量全部内容,希望文章能够帮你解决java-GSON解析未指定的类型变量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)