0

我正在使用 Spring for Android 从我的 restful 服务器和 gson 请求数据,以将 json 转换为 Java 对象,而无需访问对象中的任何函数。
由于有一个json属性“user_id”,我想在转换后将它保存为sqlite数据的主键。
问题是我的sqlite库将“mId”属性定义为抽象类中的主键。而gson convert没有使用“set function”来设置属性。我唯一想要的是将 user_id 正确地转换为 mId 。

代码如下:
1.访问sqlite的抽象类:

public abstract class Model {
    protected Long mId = null;
    public final Long getId() {
        return mId;
    }

    public void setId(Long id){
        mId = id;
    }

    public void saveToSqlite(){
        //using mId;
    }
}

2.restful用户数据类:

public class User extends Model implements Serializable{
    private static final long serialVersionUID = 1L;
    @SerializedName("user_id")
    private Long userId;

    public Long getUserId() {
        return userId;
    }

    //this function is not accessed when user object generated
    public void setUserId(Long userId) {
        this.userId = userId;
        this.setId(userId);
    }
}

3.请求和转换代码:

RestTemplate restTemplate = new RestTemplate();
GsonHttpMessageConverter jsonConverter = new GsonHttpMessageConverter();
restTemplate.getMessageConverters().add(jsonConverter);
final String url = "http://restful.test.com/users";
User[] users = restTemplate.getForObject(url, User[].class);
4

1 回答 1

0

为您的类声明一个自定义反序列化器。类似于下面的那个。

报价 - 模型

class Quote
{
    private String symbol;
    private String test; // the empty field we want to populate

    // getters() setters()
}

QuoteCreator 反序列化器 - 从符号填充测试

class QuoteCreator implements JsonDeserializer<Quote>
{

    public Quote deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException
    {
        Gson g = new Gson();
        Quote a = g.fromJson(json, Quote.class);
        a.setTest(a.getSymbol());
        return a;
    }
}

GsonBuilder b = new GsonBuilder();
b.registerTypeAdapter(Quote.class,new QuoteCreator());
Gson create = b.create();
Quote fromJson = (Quote) create.fromJson(file, Quote.class);

有用。您可以使用更通用的反射解决方案来捕获各种类,但如果只是纠正 JSON 而不是求助于这样的解决方法,它会更容易。

通用解串器

class MyCreator<T> implements JsonDeserializer<T>
{

    public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException
    {
        try
        {
            Gson g = new Gson();
            T a = g.fromJson(json, typeOfT);
            Class<? extends Object> class1 = a.getClass();
            Method getter = class1.getMethod("getSymbol", null);
            Method setter = class1.getMethod("setTest", String.class);
            String symbol = (String) getter.invoke(a, null);
            setter.invoke(a, symbol);
            return a;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}

用法

b.registerTypeAdapter(Quote.class,new MyCreator<Quote>());
于 2013-04-11T06:59:38.083 回答