2017-07-21 76 views
0

jsonapi.org標準我想分析遵循jsonapi.org標準與境界的Android

我使用jsonapi-converter的轉換器和要實現的境界,以及JSON。我無法得到任何想法或線索如何實施兩者。如果有人已經做到了,你的幫助將不勝感激。提前致謝。

+0

使用jsonapi轉換器的類是否可以擴展RealmObject並使用Realm的註釋?如果可能的話,他們可以混合在一起。否則,我認爲你應該將jsonapi轉換器對象轉換爲JsonObject,JSON字符串或Realm對象。 – Dalinaum

+0

@Dalinaum我正在爲此工作。使用jsonapi轉換器我可以解析和擴展RealmObject,但是關於我正在測試的領域註釋。 –

+0

最好的做法是將API響應和數據庫對象分開,在這種情況下,如何做到這一點並不是問題。 – EpicPandaForce

回答

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 進行領域解析。因此,這裏有我的產品類和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保存鏈接DATAS

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轉換器,你會明白的文檔它是如何工作的。棘手的部分是領域需要所有的對象擴展realmObject或realmModule我試圖過分鏈接和鏈接在jasminb/jsonapi轉換器沒有工作,所以我做了什麼在產品模型中看到。有2班

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

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

One幫助遷移從鏈接realmList其由境界的支持,另一個來自列表鏈接這是需要調用的API等

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。

0

幾乎每個查看過此代碼的人(包括我,@Dalinaum和@EpicPandaForce)都立即建議您將JSON和Realm表示法分開:將JSON讀入JSON對象,然後在JSON上添加toRealm方法對象或Realm對象上的方法(或構造函數)。

試圖在同一個對象中表示兩個外部接口將這兩個表示聯繫在一起,可能不是很好的分離關注點。

我們都同意你在做什麼是聰明的,並會工作。我們都建議你以不同的方式做!

+0

這樣做肯定會區分領域和json之間的聯繫,但這樣做會導致創建許多模型。那麼更好地讓更多的模特班將它們綁在一起?我會嘗試一次。感謝您的評論。 –