**春季启动: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)
但这是必需的,因为我们不希望这些字段由客户端写入。
您的属性被标记为
JsonProperty.Access.READ_ONLY
,因此仅可用于 Json 序列化。
杰克逊 javadoc:
访问设置意味着该属性只能在序列化时读取(通过“getter”方法访问的值,或从 Field 读取),但在反序列化期间不能写入(设置)。换句话说,这将反映“只读 POJO”,其中包含的值可以读取但不能写入/设置。
在您的测试中,您正在执行反序列化,因此该行为是预期的。正如 Jackson javadoc 所说,这可能会令人困惑:
访问属性的各种选项,指定在序列化(“读”)和反序列化(“写”)过程中如何访问属性(注意读写的方向是从属性的角度,而不是从外部数据格式:这个在某些情况下可能会令人困惑)。
如果你想反序列化,你应该使用
JsonProperty.Access.WRITE_ONLY
。