0

オブジェクト内の関数にアクセスせずに、Spring for Android を使用して安静なサーバーと gson から Converter json から Java オブジェクトにデータを要求しています。
jsonプロパティ「user_id」があるので、これを変換後のsqliteデータの主キーとして保存したい。
問題は、私のsqliteライブラリが「mId」プロパティを抽象クラスの主キーとして定義していることです。また、gson convertは「set関数」を使用してプロパティを設定していません。私が望む唯一のことは、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.安静なユーザーデータのクラス:

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 deserializer - シンボルからテストを生成

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 に答える