将 json 转换/映射为另一种格式

Posted

技术标签:

【中文标题】将 json 转换/映射为另一种格式【英文标题】:Transform/map json to another format 【发布时间】:2021-09-22 18:44:06 【问题描述】:

有很长的 JSON 对象,小部分如下:

const valueObject = zipCode: 12345, street1: 'street 1', street2: 'street 2',city:'cityname', uniqueNum: '123456789';
const mappingObject = address: pinCode: zipCode, addressLine1: 'street1', addressLine2:'street2', id: 'uniqueNum', city: city
const formatObject = address: pinCode: '', addressLine1: '', addressLine2:'', id: '0', city: ''

尝试使用mappingObjectvalueObject 转换为formatObject。 (如果valueObject 没有值,则使用formatObject 的默认值) 它没有工作。似乎有一个对象而不是一个数组。不知道这里出了什么问题,还是需要合并。

Object.keys(formatObject).map((k)=>k: valueObject[mappingObject[k]] || mappingObject[k]);

预期输出:

address: pinCode: 12345, addressLine1: 'street 1', addressLine2: 'street 2',city:'cityname', id: '123456789';

以防万一,通过 ES6 有更好的选择( 否则,使用 for 循环并准备对象。 )

【问题讨论】:

不确定你在问什么。看来您的代码将返回一个数组。但是你说你有一个对象而不是一个数组。 是的,上面的代码返回数组。但需要单个对象作为 formatObject ,只需要从 valueObject 中选择值。 【参考方案1】:

这里实际上不需要formatObject,因为mappingObject 给出了完整的转换schema,即两个结构之间的关系。 formatObject 仅作为可能输出的示例。

一个可行的实现是:

function transform(schema, x) 
  return Object.fromEntries(Object.entries(schema).map(([k, v]) => 
    if (typeof v === 'string') return [k, x[v]]
    else if (typeof v === 'object') return [k, transform(v, x)]
    else throw new TypeError(`Schema entry cannot have type $typeof v`)
  ))


transform(valueObject, mappingObject)

通过模式递归工作,将平面结构对象(在本例中为 valueObject)转换为嵌套结构对象。

【讨论】:

谢谢,Object.fromEntriesObject.entries 为我工作。

以上是关于将 json 转换/映射为另一种格式的主要内容,如果未能解决你的问题,请参考以下文章

在java中将日期从一种格式转换为另一种格式[重复]

如何使用 nsdateformatter 将 nsdate 转换为另一种格式

如何将字符串类型的日期转换为另一种日期格式。 |颤振 |飞镖[重复]

将日期转换为另一种格式的 SQL 查询

无法将日期时间从字符串转换为另一种格式(例如:14/12/2021 03:34:03 PM 到 03:34 pm)

如何在java中使用日光将日期格式从一个时区转换为另一种时区[重复]