使用Realm Android的jsonapi.org标准

时间:2017-07-21 04:55:43

标签: android realm json-api

我想解析遵循jsonapi.org标准

的json

我正在使用jsonapi-converter转换器,并且也希望实现Realm。我无法得到任何想法或线索如何实现两者。如果有人这样做了,你的帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:0)

{
   "data":[
      {
         "type":"product",
         "id":"1",
         "attributes":{
            "title":"Wai Wai Noodles",
            "description":"",
            "liked":true,
            "is-active":true
         },
         "links":{
            "self":"https://wongel.info/product/1"
         },
         "relationships":{
            "productinfo":{
               "links":{
                  "self":"https://wongel.info/product/1/relationships/productinfo",
                  "related":"https://wongel.info/product/1/productinfo"
               },
               "data":{
                  "type":"productinfo",
                  "id":"1"
               }
            }
         }
      }
   ],
   "included":[
      {
         "type":"productinfo",
         "id":"1",
         "attributes":{
            "product-category":null,
            "description":null
         },
         "links":{
            "self":"https://wongel.info/productinfo/1"
         }
      }
   ]
}

这是我的json,我必须按照jsonApi.Org标准解析。我正在使用 jasminb/jsonapi-converter 来解析领域。这是我的Product类和Prodct信息类

@Type("product")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product extends RealmObject {
    @Id
    @PrimaryKey
    @JsonProperty("id")
    private String id;
    @JsonProperty("title")
    private String title;
    @JsonProperty("description")
    private String description;
    @JsonProperty("is_active")
    private boolean isActive;
    @JsonProperty("liked")
    private boolean liked;

    @Relationship("productinfo")
    private ProductInfo productInfo;

    @Ignore
    @Links
    @JsonProperty("links")
    private com.github.jasminb.jsonapi.Links links;
    @JsonIgnore
    private RealmList<JsonMap> linkList;

    @Ignore
    @RelationshipLinks("productinfo")
    private com.github.jasminb.jsonapi.Links productLinks;
    @JsonIgnore
    private RealmList<JsonMap> productLinkList;

    //setter getter

    public void migrateToList() {
        linkList = GlobalUtils.getMap(links);
        productLinkList = GlobalUtils.getMap(productLinks);
    }

    public void migrateToLink() {
        links = GlobalUtils.getMap(linkList);
        productLinks = GlobalUtils.getMap(productLinkList);
    }
}

ProductInfo

@Type("productinfo")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ProductInfo extends RealmObject {
    @Id
    @PrimaryKey
    @JsonProperty("id")
    private String id;
    @JsonProperty("product-category")
    private String category;
    @JsonProperty("description")
    private String description;

//setter getter
}

用于保存链接数据的JsonMap

public class JsonMap extends RealmObject {
    private String key;
    private String value;

    public JsonMap() {

    }

    public JsonMap(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

因此,一旦阅读了jasminb / jsonapi-converter的文档,您就会明白它是如何工作的。棘手的部分是领域需要它的所有对象扩展realmObject或realmModule我尝试覆盖jasminb / jsonapi转换器中的链接和链接没有工作,所以我做的是在产品模型中看到。有两个班级

public void migrateToList() {
        linkList = GlobalUtils.getMap(links);
        productLinkList = GlobalUtils.getMap(productLinks);
    }

    public void migrateToLink() {
        links = GlobalUtils.getMap(linkList);
        productLinks = GlobalUtils.getMap(productLinkList);
    }

一个有助于将数据从链接迁移到realmList,由realm支持,另一个从list到link,这是调用apis等所需的。

ResourceConverter converter = new ResourceConverter(ProductR.class, ProductInfo.class);
        converter.enableSerializationOption(SerializationFeature.INCLUDE_RELATIONSHIP_ATTRIBUTES);

        JSONAPIConverterFactory converterFactory = new JSONAPIConverterFactory(converter);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BuildConfig.BASE_URL)
                .addConverterFactory(converterFactory)
                .build();
        ApiService apiService = retrofit.create(ApiService.class);

        Call<JSONAPIDocument<List<Product>>> call = apiService.getProducts();

        call.enqueue(new Callback<JSONAPIDocument<List<Product>>>() {
            @Override
            public void onResponse(Call<JSONAPIDocument<List<Product>>> call, Response<JSONAPIDocument<List<Product>>> response) {
                if (response.isSuccessful()) {
                    // success
                } else {
                    //error body
                }

            }

            @Override
            public void onFailure(Call<JSONAPIDocument<List<Product>>> call, Throwable t) {
                //failed
            }
        });

以上代码用于调用服务器api。

答案 1 :(得分:0)

几乎所有审阅过此代码的人(包括我,@ Dalinaum和@EpicPandaForce)都立即建议您将JSON和Realm表示分开:将JSON读入JSON对象并添加toRealm方法在JSON对象上,或Realm对象上的fromJson方法(或构造函数)。

尝试在同一个对象中表示两个外部接口将两个表示绑定在一起,可能不是很好的关注点分离。

我们都同意你所做的是聪明的并且会奏效。我们都建议您采取不同的方式!