使用NeoJSON时,如何将嵌套JSON的内部属性映射到Pharo对象?
如何用NeoJSON将嵌套JSON属性映射到Pharo对象?
问题描述
给定如下JSON数据:
{ "id": 12, "fields": { "name": "Hello Pharo" } }
需要将其反序列化为Pharo的MyObject类实例,该类包含id和name两个实例变量。目前已完成id的映射,但不知道如何处理嵌套在fields下的name属性。现有代码如下:
| reader | reader := NeoJSONReader on: entity contents readStream. reader for: MyObject do: [ :mapping | mapping mapInstVars: #( id ) ]. reader nextAs: MyObject
解决方案
在NeoJSON的映射配置中,你可以通过自定义取值逻辑提取嵌套的fields.name属性,直接赋值给MyObject的name实例变量。修改后的代码如下:
| reader | reader := NeoJSONReader on: entity contents readStream. reader for: MyObject do: [ :mapping | mapping mapInstVars: #( id ). // 从JSON对象的fields子节点中提取name属性 mapping mapInstVar: #name to: [ :json | json at: 'fields' at: 'name' ] ]. reader nextAs: MyObject
代码说明
mapping mapInstVar: #name to: [ :json | ... ]用于指定MyObject的name实例变量如何从JSON数据中取值。- 块参数
json代表整个顶层JSON对象,先通过at: 'fields'获取嵌套子对象,再用at: 'name'取出目标属性值。
如果偏好更简洁的写法,也可以使用路径形式的映射:
mapping mapProperty: 'fields.name' to: #name
该写法和上述块逻辑效果完全一致。
内容的提问来源于stack exchange,提问作者Benoit Verhaeghe
相关产品推荐
相关产品推荐

