Разбор конкретного JSON с помощью Google GSON - PullRequest
2 голосов
/ 17 апреля 2011

Мне нужно проанализировать элемент JSON, который можно определить следующим образом:

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

или

{
    ...
    "itemName": {

    }
    ...
}

По сути, фид, из которого я читаю, определяет itemName как пустую строку, если значения нет, в противном случае это обычный объект JSON, который я могу нормально проанализировать.

Я полагаю, что именно это вызывает ошибку GSON, которую я испытываю, хотя я могу ошибаться.

Как можно проанализировать такой канал JSON, включая поля, определенные, как я показал выше, без возникновения ошибки GSON? Или как я могу устранить эту ошибку и перейти на анализ?

вот логкат:

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

Я использую GSON, включенный в банку AdMob 4.0.4

1 Ответ

2 голосов
/ 08 июня 2011

Для этого вам нужно реализовать собственный десериализатор. Ниже приведен один пример.

// 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, в зависимости от того, что требуется, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...