Java 使用Google反序列化Bugzilla JSON时出现问题';斯格森

Java 使用Google反序列化Bugzilla JSON时出现问题';斯格森,java,json,gson,Java,Json,Gson,我在JSON中遇到了一个问题,我从Bugzilla服务器返回,因为它有时返回“text”:{},有时返回“text”:“废话废话”。如果没有给出bug的描述,Bugzilla将返回前者。我很困惑,为什么它没有回归为更合理的“文本”:“但它确实如此,仅此而已 如果我在Gson的目标对象中有一个名为text的字符串,那么它在看到{}情况时会进行对象化,因为它说这是一个对象而不是字符串: Exception in thread "main" com.google.gson.JsonParseExcep

我在JSON中遇到了一个问题,我从Bugzilla服务器返回,因为它有时返回“text”:{},有时返回“text”:“废话废话”。如果没有给出bug的描述,Bugzilla将返回前者。我很困惑,为什么它没有回归为更合理的“文本”:“但它确实如此,仅此而已

如果我在Gson的目标对象中有一个名为text的字符串,那么它在看到{}情况时会进行对象化,因为它说这是一个对象而不是字符串:

Exception in thread "main" com.google.gson.JsonParseException: The 
JsonDeserializer StringTypeAdapter failed to deserialized json object {} given 
the type class java.lang.String

关于如何让Gson解析这个问题,有什么建议吗?

尝试将
文本
字段声明为
对象
。然后做一些类似的事情:

public String getTextAsString() {
    if (text instanceof String) {
        return (String) text;
    else {
        return null;
    }
}

您应该将其作为bug报告给Bugzilla项目。这种行为没有充分的理由。

尝试将
文本
字段声明为
对象
。然后做一些类似的事情:

public String getTextAsString() {
    if (text instanceof String) {
        return (String) text;
    else {
        return null;
    }
}

您应该将其作为bug报告给Bugzilla项目。这种行为没有充分的理由。

Gson需要针对原始问题中的情况进行自定义反序列化。下面就是这样一个例子

input.json:

[
  {
    "text":"some text"
  },
  {
    "text":{}
  }
]
import java.io.FileReader;
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
{
  public static void main(String[] args) throws Exception
  {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(String.class, new StringDeserializer());
    Gson gson = gsonBuilder.create();
    Thing[] things = gson.fromJson(new FileReader("input.json"), Thing[].class);
    System.out.println(gson.toJson(things));
  }
}

class Thing
{
  String text;
}

class StringDeserializer implements JsonDeserializer<String>
{
  @Override
  public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException
  {
    if (json.isJsonPrimitive()) return json.getAsString();
    return "";
  }
}
[{"text":"some text"},{"text":""}]
Foo.java:

[
  {
    "text":"some text"
  },
  {
    "text":{}
  }
]
import java.io.FileReader;
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
{
  public static void main(String[] args) throws Exception
  {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(String.class, new StringDeserializer());
    Gson gson = gsonBuilder.create();
    Thing[] things = gson.fromJson(new FileReader("input.json"), Thing[].class);
    System.out.println(gson.toJson(things));
  }
}

class Thing
{
  String text;
}

class StringDeserializer implements JsonDeserializer<String>
{
  @Override
  public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException
  {
    if (json.isJsonPrimitive()) return json.getAsString();
    return "";
  }
}
[{"text":"some text"},{"text":""}]

当然,可以为
Thing.class
类型使用自定义反序列化程序。这样做的好处是不必为每个
字符串添加额外的处理,但是您将不得不“手动”处理
Thing

的所有其他属性,Gson需要针对原始问题中的情况进行自定义反序列化。下面就是这样一个例子

input.json:

[
  {
    "text":"some text"
  },
  {
    "text":{}
  }
]
import java.io.FileReader;
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
{
  public static void main(String[] args) throws Exception
  {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(String.class, new StringDeserializer());
    Gson gson = gsonBuilder.create();
    Thing[] things = gson.fromJson(new FileReader("input.json"), Thing[].class);
    System.out.println(gson.toJson(things));
  }
}

class Thing
{
  String text;
}

class StringDeserializer implements JsonDeserializer<String>
{
  @Override
  public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException
  {
    if (json.isJsonPrimitive()) return json.getAsString();
    return "";
  }
}
[{"text":"some text"},{"text":""}]
Foo.java:

[
  {
    "text":"some text"
  },
  {
    "text":{}
  }
]
import java.io.FileReader;
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
{
  public static void main(String[] args) throws Exception
  {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(String.class, new StringDeserializer());
    Gson gson = gsonBuilder.create();
    Thing[] things = gson.fromJson(new FileReader("input.json"), Thing[].class);
    System.out.println(gson.toJson(things));
  }
}

class Thing
{
  String text;
}

class StringDeserializer implements JsonDeserializer<String>
{
  @Override
  public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException
  {
    if (json.isJsonPrimitive()) return json.getAsString();
    return "";
  }
}
[{"text":"some text"},{"text":""}]

当然,可以为
Thing.class
类型使用自定义反序列化程序。这样做的好处是不必为每个
字符串添加额外的处理,但是您将不得不“手动”处理
东西的所有其他属性

您在Bugzilla中使用的JSON接口是什么?我是JSON-RPC接口的作者,我无法想象在什么情况下会发生这种情况。如果这是REST API,那就不同了——这是一个单独维护的产品。我使用的是REST API。你在Bugzilla中使用的JSON接口是什么?我是JSON-RPC接口的作者,我无法想象在什么情况下会发生这种情况。如果这是REST API,那就不同了——这是一个单独维护的产品。我使用的是REST API。如果“text”被声明为类型对象,那么Gson仍然会被“text”阻塞:{},抱怨说,“类型信息不可用,目标对象不是原语:{}”。如果“text”被声明为类型对象,然后Gson仍然阻塞“text”:{},抱怨“类型信息不可用,目标对象不是原语:{}”。