2015-10-04 130 views
0

我使用改造得到以下论断方案从API的结果:反序列化字符串考虑空单为空字符串

  • { "somekey": "somestringvalue" }
  • { "somekey": [] }
  • { "somekey": "" }

如果双方[]""实际上表示相同的值:一个空字符串。在解析时

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(String.class, new StringAdapter()).create(); 

RestAdapter restAdapter = new RestAdapter.Builder() 
          .setEndpoint(END_POINT) 
          .setConverter(new GsonConverter(gson)) 
          .build(); 

但是,它仍然产生了我同样的错误:

所以我写了一个TypeAdapter这样的:

public class StringAdapter extends TypeAdapter<String> { 
    @Override 
    public void write(JsonWriter out, String value) throws IOException { 

    } 

    @Override 
    public String read(JsonReader in) throws IOException { 
     if(in.peek() == JsonToken.BEGIN_ARRAY){ 
      return ""; 
     } 
     return in.nextString(); 
    } 
} 

然后我registred像这样

retrofit.RetrofitErrorcom.google.gson.JsonSyntaxExceptionjava.lang.IllegalStateException:需要一个名字,但被BEGIN_ARRAY在行1列85路

我想我missunderstood的东西,但什么?

回答

1

您检查元素in.peek(),但您需要从输入流中消耗该值,或者它处理下一个元素的方式。您可以使用in.skipValue

@Override 
public String read(JsonReader in) throws IOException { 
    if (in.peek() == JsonToken.BEGIN_ARRAY) { 
     in.skipValue(); 
     return ""; 
    } 
    return in.nextString(); 
}