Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Gson优雅地处理嵌套的json对象?_Java_Android_Gson_Retrofit - Fatal编程技术网

Java 使用Gson优雅地处理嵌套的json对象?

Java 使用Gson优雅地处理嵌套的json对象?,java,android,gson,retrofit,Java,Android,Gson,Retrofit,我正在使用Gson解析来自安卓服务器的响应。每个响应都有一些无用的(对我来说)数据,这使我的Gson模型变得复杂。以下是返回的json的一般层次结构: response: { date: 1406253006807, otherUselessData1: "This is some useless data", otherUselessData2: "This is some useless data", usefulJsonObject: { <---- This

我正在使用Gson解析来自安卓服务器的响应。每个响应都有一些无用的(对我来说)数据,这使我的Gson模型变得复杂。以下是返回的json的一般层次结构:

response: {
  date: 1406253006807,
  otherUselessData1: "This is some useless data",
  otherUselessData2: "This is some useless data",

  usefulJsonObject: {   <---- This is really the object that I care about
  }

}
我尝试了一些解决方案,但我没有发现任何优雅的方法不会给我的过程增加额外的步骤。我正在使用改型来处理我的http请求,它只是将完全解析的gson对象返回给我,这真是太好了。我还考虑过其他解决方案,比如让有用的对象只是一个JsonElement,然后在第一个返回后执行第二个gson调用。同样,这并不理想


我只是想知道我是否错过了什么。当然,我不是唯一遇到这种情况的人,所以我想我应该问问其他人会如何处理这种情况。

这是初始化
实例
值,而不是
NULL
值。看看我的例子

Address.java

public class Address {
    public Address(){
    }
}
Person.java

public class Person {
    private String name;
    private String nrc;
    private Address address;

    public Person(String name, String nrc, Address address) {
        this.name = name;
        this.nrc = nrc;
        this.address = address;
    }
}
以下
Json
字符串等于

Person person = new Person("Zaw Than Oo", "11111", null);

{
  "name": "Zaw Than Oo",
  "nrc": "11111"
}
Person person = new Person("Zaw Than Oo", "11111", new Address());

{
  "name": "Zaw Than Oo",
  "nrc": "11111",
  "address": {} <-- here use less object for you. 
}
以下
Json
字符串等于

Person person = new Person("Zaw Than Oo", "11111", null);

{
  "name": "Zaw Than Oo",
  "nrc": "11111"
}
Person person = new Person("Zaw Than Oo", "11111", new Address());

{
  "name": "Zaw Than Oo",
  "nrc": "11111",
  "address": {} <-- here use less object for you. 
}

我从来没有找到一种优雅的方式来对付格森。我尝试了几个泛型选项,所有这些选项都不起作用,或者留下了一些需要改进的地方

因为我在使用改型,所以我决定覆盖GsonConverter,从所有请求中过滤掉不必要的信息。它最终没有那么灵活,因为我不能使用相同的翻新网络接口来调用其他服务器,但我并不是真的这么做,它还有一个缺点,就是有两轮json解析调用(meh)。你也许可以更有效地做这件事,但这对我现在来说是可行的

public class CustomGsonConverter extends GsonConverter {

  private Gson mGson;

  public CustomGsonConverter(Gson gson) {
    super(gson);
    this.mGson = gson;
  }

  public CustomGsonConverter(Gson gson, String encoding) {
    super(gson, encoding);
    this.mGson = gson;
  }

  @Override public Object fromBody(TypedInput body, Type type) throws ConversionException {
    try {
      CustomResponse customResponse = mGson.fromJson(new InputStreamReader(body.in()), CustomResponse.class);
      return mGson.fromJson(customResponse.responseObject.data, type);
    } catch (IOException e) {
      throw new ConversionException(e);
    }
  }

  public static class CustomResponse {

    @SerializedName("rsp") ResponseObject responseObject;

    public static class ResponseObject {

//    @SerializedName("date") long date;

      @SerializedName("data") JsonElement data;

    }

  }

}

也许有一种更好的方法我只是没有意识到。

你是说
usefulJsonObject
是动态的吗?它的价值可以是任何东西,但你需要它吗?@SotiriosDelimanolis不,它总是有相同的钥匙。因此,在本例中,它将始终被命名为“usefulJsonObject”。该键值对的值如何?@SotiriosDelimanolis对于不同的rest端点,usefulJsonObject的值将不同。它将为每个rest端点包含不同的对象结构,所以我认为您误解了我的问题。我实际上无法控制服务器向我发送的内容。我有几个请求,所有的响应都包含无用的信息,这迫使我创建无用的类来表示每个请求的无用信息,因为无用的信息迫使有用的信息成为继承人。我所关心的只是访问response>usefulJsonObject中的信息,但为了做到这一点,我必须为可能得到的每个响应创建3个单独的类。我正在寻找一个解决方法。我所要做的就是这样做,这样我就不必为每个响应创建3个类,这样我就可以得到我想要的有用信息。