使用杰克逊解析领域模型

Posted

技术标签:

【中文标题】使用杰克逊解析领域模型【英文标题】:Parse realm model using jackson 【发布时间】:2018-04-20 23:48:53 【问题描述】:

使用jackson库将领域模型转换为json对象时获取未知密钥。

这是我的领域模型实例。

    public class RecordData extends RealmObject 

    public RecordData() 

    

    private FormData formData;

    @Nullable
    @JsonProperty("values")
    private RealmList<Values> values;

    @Nullable
    @JsonProperty("value")
    private String value;

将领域模型转换为 json 对象的代码。

JSONObject recordDataJsonObject = new JSONObject(new ObjectMapper().writeValueAsString(formData.getRecordData()));

解析 json 的输出:

"loaded":true,"managed":false,"valid":true,"value":"fdfdf","values":[]

领域版本:io.realm:realm-gradle-plugin:4.1.1

Rxjava 版本:'io.reactivex.rxjava2:rxjava:2.1.6'

杰克逊版:com.fasterxml.jackson.core:jackson-databind:2.8.6

为什么我得到加载、托管和有效的布尔值?

【问题讨论】:

可以发getRecordData()的代码吗? getRecordData() 方法只返回 RecordData 领域模型实例 你不做任何Realm.where().findAll() 查询吗?我需要查看该代码以验证您是否遇到了我解决的类似问题。 这没有任何意义,这些布尔值是领域对象的内部字段。但它不应该出现在 json 中。 【参考方案1】:

从 ObjectMapper 写响应,你必须这样做:

public static String getJsonFromObject() 
        ObjectMapper objectMapper = ObjectMapperHelper.getObjectMapperInstance();
        String jsonString = null;
           try 
            jsonString = objectMapper.writeValueAsString(formData.getRecordData());
         catch (JsonProcessingException e) 
            e.printStackTrace();
        
        return jsonString != null ? jsonString : "";
    

并在 JsonObject 中得到您的回复:

try 
    JSONObject jsonObject = new JSONObject().getJSONObject(getJsonFromObject());
      catch (JSONException e) 
       e.printStackTrace();
       

编码愉快!!

【讨论】:

我使用了上面相同的方法,但问题存在。【参考方案2】:

我已经使用 Gson 解析库解决了。

JSONObject recordDataJsonObject = new JSONObject(new Gson().toJson(formData.getRecordData()));

它不返回未知密钥。输出在这里。

"value":"fdfdf","values":[]

如果您面临同样的情况,希望您能找到此解决方案。

【讨论】:

【参考方案3】:

你可以使用@JsonIgnoreProperties注解:

@JsonIgnoreProperties("loaded", "managed", "valid")
public class RecordData extends RealmObject 

    public RecordData() 

    

    private FormData formData;

    @Nullable
    @JsonProperty("values")
    private RealmList<Values> values;

    @Nullable
    @JsonProperty("value")
    private String value;

另一种选择是使用@RealmClass public class RecordData implements RealmModel

【讨论】:

使用 JsonIgnoreProperties 将是击球手选项。但是@RealmClass 注解已经添加到我的类中了。 重点是implements RealmModel而不是extends RealmObject,但我认为忽略属性更容易

以上是关于使用杰克逊解析领域模型的主要内容,如果未能解决你的问题,请参考以下文章

Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

DDD(领域驱动设计)

杰克逊自定义序列化程序或值对象?

贫血领域模型与领域模型

NLP预训练语言模型(三):逐步解析Transformer结构

使用函数式语言建立领域模型