使用 google GSON 解析特定 JSON

发布于 2024-11-01 17:35:15 字数 583 浏览 0 评论 0原文

我需要解析一个 JSON 项目,其定义如下:

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

或者

{
    ...
    "itemName": {

    }
    ...
}

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

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

如何解析这样的 JSON 提要,其中包括像上面所示定义的字段,而不会导致 GSON 错误?或者我如何抑制此错误并继续解析?

这是 logcat:

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

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

I need to parse a JSON item which could be defined as follows:

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

or

{
    ...
    "itemName": {

    }
    ...
}

Basically, the feed i am reading from defines itemName as an empty string if there is no value, otherwise it is a regular JSON object which i can parse fine.

I believe this is what is causing the GSON error i am experiencing, although i may be wrong.

How can I parse such a JSON feed including fields defined like i have shown above, without causing a GSON error? Or how can i suppress this error and move on parsing?

here is the logcat:

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

I am using the GSON included in the AdMob 4.0.4 jar

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尐偏执 2024-11-08 17:35:15

您需要为此实现一个自定义解串器。下面是一个例子。

// 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,具体取决于所需的内容。

You'd need to implement a custom deserializer for this. Following is one example.

// 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);
  }
}

This could easily be changed to return an empty Inner instance instead of null, depending on what's desired, of course.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文