【问题标题】:parsing a particular JSON with google GSON使用谷歌 GSON 解析特定的 JSON
【发布时间】:2011-04-17 13:34:21
【问题描述】:

我需要解析一个可以定义如下的 JSON 项:

{
    ...
    "itemName": ""
    ...
}

{
    ...
    "itemName": {

    }
    ...
}

基本上,如果没有值,我正在读取的提要将 itemName 定义为空字符串,否则它是一个常规 JSON 对象,我可以很好地解析。

我相信这是导致我遇到的 GSON 错误的原因,尽管我可能是错的。

我怎样才能解析这样的 JSON 提要,包括我上面显示的定义的字段,而不会导致 GSON 错误?或者我怎样才能抑制这个错误并继续解析?

这里是日志:

ERROR/AndroidRuntime(32720): Caused by: com.google.gson.JsonParseException: Expecting object found: ""

我正在使用 AdMob 4.0.4 jar 中包含的 GSON

【问题讨论】:

    标签: android gson


    【解决方案1】:

    您需要为此实现自定义反序列化程序。以下是一个例子。

    // output: 
    // {Outer: item=null}
    // {Outer: item={Inner: value=foo}}
    
    import java.lang.reflect.Type;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.google.gson.JsonDeserializationContext;
    import com.google.gson.JsonDeserializer;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonParseException;
    
    public class Foo
    {
      static String json1 = "{\"item\":\"\"}";
      static String json2 = "{\"item\":{\"value\":\"foo\"}}";
    
      public static void main(String[] args)
      {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Inner.class, new InnerDeserializer());
        Gson gson = gsonBuilder.create();
        Outer outer1 = gson.fromJson(json1, Outer.class);
        System.out.println(outer1);
        Outer outer2 = gson.fromJson(json2, Outer.class);
        System.out.println(outer2);
      }
    }
    
    class InnerDeserializer implements JsonDeserializer<Inner>
    {
      @Override
      public Inner deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
          throws JsonParseException
      {
        if (json.isJsonPrimitive())
        {
          return null;
        }
        return new Gson().fromJson(json, typeOfT);
      }
    }
    
    class Outer
    {
      Inner item;
    
      @Override
      public String toString()
      {
        return String.format("{Outer: item=%s}", item);
      }
    }
    
    class Inner
    {
      String value;
    
      @Override
      public String toString()
      {
        return String.format("{Inner: value=%s}", value);
      }
    }
    

    这可以很容易地更改为返回一个空的 Inner 实例而不是 null,当然,这取决于需要什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2012-01-02
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多