如何使用javascript函数将多行JSON字符串转换为单行
我有以下JSON格式的REST API输出: 我需要将格式转换为平面格式,以便将其作为输入传递给另一个API调用如何使用javascript函数将多行JSON字符串转换为单行,javascript,json,Javascript,Json,我有以下JSON格式的REST API输出: 我需要将格式转换为平面格式,以便将其作为输入传递给另一个API调用 { "result": { "data": [ { "data": 2.824315071105957, "dateTime": "2019-09-10T11:32:05.220Z", "device": { "id": "b3" }, "diagnostic": { "id": "Diagnos
{
"result": {
"data": [
{
"data": 2.824315071105957,
"dateTime": "2019-09-10T11:32:05.220Z",
"device": { "id": "b3" },
"diagnostic": { "id": "DiagnosticAccelerationForwardBrakingId" },
"controller": "ControllerNoneId",
"version": "00000000000363b0",
"id": "a5UyPzhknSC-N2wtLBph3BA"
},
{
"data": 0,
"dateTime": "2019-09-10T11:32:05.220Z",
"device": { "id": "b3" },
"diagnostic": { "id": "DiagnosticAccelerationSideToSideId" },
"controller": "ControllerNoneId",
"version": "00000000000363b1",
"id": "a5UyPzhknSC-N2wtLBph3BQ"
},
// ... 1000's of rows like this
]
}
}
我需要使用java脚本将其转换为以下格式
所需格式:
{"result":{ "data":[{"id":"b3","dateTime":"2019-09- 10T11:32:05.220Z","DiagnosticAccelerationSideToSideId":0,"DiagnosticAccelerationForwardBrakingId ":2.824315071105957},...
这些行需要与主键合并,作为ID和dateTime属性的组合。请注意,诊断id值成为所需格式的键,数据值是键的值
有没有办法将这个JSON转换成上面的平面格式
需要将用于单个数据输入的多行JSON转换为单行格式。需要一个java脚本函数,该函数可以接受行字符串格式并转换或合并它,然后以所需格式返回字符串
function String mergeRows(String flatDataJSONString) {
...
}
如注释中所述,您首先希望有一个干净的json定义,以便将其字符串化。请首先获取JSON的以下定义:
const json = {
"result": [
{
"data": 2.824315071105957,
"dateTime": "2019-09-10T11:32:05.220Z",
"device": { "id": "b3" },
"diagnostic": { "id": "DiagnosticAccelerationForwardBrakingId" },
"controller": "ControllerNoneId",
"version": "00000000000363b0",
"id": "a5UyPzhknSC-N2wtLBph3BA"
},
{
"data": 0,
"dateTime": "2019-09-10T11:32:05.220Z",
"device": { "id": "b3" },
"diagnostic": { "id": "DiagnosticAccelerationSideToSideId" },
"controller": "ControllerNoneId",
"version": "00000000000363b1",
"id": "a5UyPzhknSC-N2wtLBph3BQ"
}]
};
然后你就可以像以后一样表演了:
JSON.stringify(json)
希望这有帮助 如果项目是有序的,意味着i和i+1被合并,而不是以i+=2的跳跃进行迭代 如果对象未排序或要合并的项的数量可以大于2,则使用具有由id和日期组成的唯一键的对象,并在记录与此键匹配时覆盖其数据:
function merger (jsonStr) {
// convert str to obj
const jsonObj = JSON.parse(jsonStr);
const dataObj = {};
for (let i = 0; i < jsonObj.result.length; i++) {
const item = jsonObj.result[i];
// use unique key to merge by
const itemUniqueKey = item.device.id + item.dateTime;
// take last value or create empty object if not exists
const existingItem = dataObj[itemUniqueKey] || {};
// add some logic to merge item with existingItem as you need
...
// set the result back to dataObj to be used on next merges
dataObj[itemUniqueKey] = [merge result of item and existing item];
}
// take dataObj values, you don't need the keys any more
const dataArr = Object.values(dataObj);
const finalResult = {
result: {
data: dataArr
}
}
// convert back to json
return JSON.stringify(finalResult);
}
为什么我觉得上面代码段中的某些地方应该使用方括号而不是花括号?你是对的,正确的结构如下,我也将在上面的示例中更新:{result:{data:[{data:1,dateTime:2019-09-10T10:46:47.063Z,device:{id:b3},diagnosticinationid},控制器:ControllerOneID,版本:000000000003627c,id:aPaDxqeiQ-yIozH_uM8CqAA},是我还是第一个和第二个看起来一样?是的,Ayyash,除了数据元素是数组,需要一个方括号而不是花括号Hanks这很有用,你能解释一下合并逻辑吗,我需要合并并将值作为键感谢@Lior,我可以通过以下逻辑使其工作:ifdataObj[itemUniqueKey]==null{dataObj[itemUniqueKey]='id:'+item.device.id+',dateTime:'+item.dateTime+','+item.diagnostic.id+':'+item.data;}否则{dataObj[itemUniqueKey]=dataObj[itemUniqueKey]+','+item.diagnostic.id+':'+item.data;}这就解决了这个问题。太好了,很高兴它有帮助