我想解析遵循jsonapi.org标准
的json我正在使用jsonapi-converter转换器,并且也希望实现Realm。我无法得到任何想法或线索如何实现两者。如果有人这样做了,你的帮助将不胜感激。提前谢谢。
答案 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
方法(或构造函数)。
尝试在同一个对象中表示两个外部接口将两个表示绑定在一起,可能不是很好的关注点分离。
我们都同意你所做的是聪明的并且会奏效。我们都建议您采取不同的方式!