@JsonProperty(access = Access.READ_ONLY) 字段解析后填充为空值

问题描述 投票:0回答:1

**春季启动:2.7.18 格罗维:3.0.17 等级:等级8.6 杰克逊:2.13.5 **

以下是代码片段:

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.annotation.JsonProperty

class WorkOrder {
    String id
    String batchId
    String orderId
    String manufacturingBatchType
    String manufacturingFamily

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    String dateCreated

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    String lastUpdated

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    String deviceFamilyName

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    String batchingId

    @Override
    public String toString() {
        return "WorkOrder{" +
                "id='" + id + '\'' +
                ", batchId='" + batchId + '\'' +
                ", orderId='" + orderId + '\'' +
                ", manufacturingBatchType='" + manufacturingBatchType + '\'' +
                ", manufacturingFamily='" + manufacturingFamily + '\'' +
                ", dateCreated='" + dateCreated + '\'' +
                ", lastUpdated='" + lastUpdated + '\'' +
                ", deviceFamilyName='" + deviceFamilyName + '\'' +
                ", batchingId='" + batchingId + '\'' +
                '}';
    }
}

void test() {
    String jsonResp = '''{
            "id": "28847822",
            "batchId": "EVT4Z6MVS-260-PKG",
            "orderId": "202312261718001269089165",
            "manufacturingBatchType": "MFG_BATCH",
            "manufacturingFamily": "Sports wMFG Batch",
            "dateCreated": "2024-05-02T14:08:34.698",
            "lastUpdated": "2024-05-02T16:09:32.276",
            "deviceFamilyName": "HP Equipment Router",
            "batchingId": 10
}'''

    ObjectMapper mapper = new ObjectMapper()
    WorkOrder workOrder = mapper.readValue(jsonResp, WorkOrder.class)
    println workOrder
}

实际O/p:

WorkOrder{id='28847822',batchId='EVT4Z6MVS-260-PKG',orderId='202312261718001269089165',makingBatchType='MFG_BATCH',makingFamily='体育 wMFG 批次',dateCreated='null',lastUpdated='null' , deviceFamilyName='null',batchingId='null'}

预计O/p:

WorkOrder{id='28847822',batchId='EVT4Z6MVS-260-PKG',orderId='202312261718001269089165',makingBatchType='MFG_BATCH',makingFamily='体育wMFG批次',dateCreated='2024-05-02T14: 08 :34.698',lastUpdated ='2024-05-02T16:09:32.276',deviceFamilyName ='HP设备路由器',batchingId ='10'}

如果您观察到预期的操作。这里的字段使用 JSON 中的实际值填充。

注意:如果我们删除 READ_ONLY 代码,则会填充该值:

@JsonProperty(访问= JsonProperty.Access.READ_ONLY)

但这是必需的,因为我们不希望这些字段由客户端写入。

spring-boot jackson-databind jackson2
1个回答
0
投票

您的属性被标记为

JsonProperty.Access.READ_ONLY
,因此仅可用于 Json 序列化。

杰克逊 javadoc:

访问设置意味着该属性只能在序列化时读取(通过“getter”方法访问的值,或从 Field 读取),但在反序列化期间不能写入(设置)。换句话说,这将反映“只读 POJO”,其中包含的值可以读取但不能写入/设置。

在您的测试中,您正在执行反序列化,因此该行为是预期的。正如 Jackson javadoc 所说,这可能会令人困惑:

访问属性的各种选项,指定在序列化(“读”)和反序列化(“写”)过程中如何访问属性(注意读写的方向是从属性的角度,而不是从外部数据格式:这个在某些情况下可能会令人困惑)。

如果你想反序列化,你应该使用

JsonProperty.Access.WRITE_ONLY

© www.soinside.com 2019 - 2024. All rights reserved.