2013-04-11 71 views
0

我正在使用Spring for Android从无法访问对象中的任何函数的情况下向我的宁静服务器和gson请求数据到Converter json到Java objetct。
由于有一个json属性“user_id”,我想将这个保存为转换后的sqlite数据的主键。
问题是我的sqlite库定义了一个“mId”属性作为抽象类中的主键。并且gson convert没有使用“set function”来设置属性。 我唯一想要的就是把user_id转换为mId。如何在抽象类中使用RestTemplate和Spring for Android时设置属性

下面是代码:
1.抽象类来访问源码:

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.An类宁静用户数据:

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.request并转换代码:

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); 

回答

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>()); 
+0

谢谢迪帕克,我已经尝试这样做。 this.setId(userId); 设置mId。但gson转换器不访问setUserId函数!所以未能解决这个问题。 – 2013-04-11 07:06:53

+0

我假设你的意思是你会尝试这样做。让我们知道它是如何摆脱的。谢谢。 – 2013-04-11 07:08:56

+0

我编辑我上面的评论。 – 2013-04-11 07:11:44