特殊场景
0 OR 1 && True OR False 转换
有时候api接口返回的数据中经常用0&1代替False&True 返回给客户端,例如下面这样的数据结构:
{
"data": {
"has_next": 0,
"products": [
{
}
]
},
"result": 1
}
has_next
表示是否有下一页,我们在客户端里面用False&True 更为简单的做判断,但这里返回了0&1 该怎么对应解析呢? 翻看Gson提供的注解解析的方式发现里面有这样一个注解JsonAdapter
。作用是允许用户序列化反序列化为自己想要的数据类型,这里我们需要将0&1 变成False&True 因此有了一下实现:
public class BooleanJsonAdapter extends TypeAdapter<Boolean> {
@Override
public void write(JsonWriter out, Boolean value) throws IOException {
out.value(value ? 1 : 0);
}
@Override public Boolean read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return false;
}
try {
int x = in.nextInt();
return x != 0;
} catch (Exception e) {
throw new JsonSyntaxException(e);
}
}
}
Model里一个属性对应多个json 字段
有时候服务器也会不知道怎么想的,两个接口返回同样的数据结构但是其中一个属性的名字是不同的该怎么做呢?像下面这种形式:recommend_images
和 images
实际上是同样的内容,可能脑袋抽风两个接口用了不同的名称
{
"data": {
"has_next": 0,
"products": [
{
"recommend_images":[]
}
]
},
"result": 1
}
{
"data": {
"has_next": 0,
"products": [
{
"images":[]
}
]
},
"result": 1
}
Gson 提供了一个下面这种形式便可以将两个不同的字段解析为同一个属性:
@SerializedName(value = "recommend_images", alternate = {"images”})
private List<String> images;
网友评论