Coldfusion 合并具有相同密钥的两个JSON对象
我有这样的JSONColdfusion 合并具有相同密钥的两个JSON对象,coldfusion,deserialization,lucee,Coldfusion,Deserialization,Lucee,我有这样的JSON [{ "Emails":"10@xyz.com" }, { "Emails":"20@xyz.com" }, { "Emails":"30@xyz.com" }, { "Emails":"40@xyz.com" }] 输
[{
"Emails":"10@xyz.com"
},
{
"Emails":"20@xyz.com"
},
{
"Emails":"30@xyz.com"
},
{
"Emails":"40@xyz.com"
}]
输出我尝试如下:
[{
"Emails":"10@xyz.com#chr10#20@xyz.com#chr10#30@xyz.com#chr10#40@xyz.com"
}]
chr(10)
下一行
我正在尝试将这些值合并到同一个键,所以一个键和多个值
我是否需要反转到反序列化并在CF中再次重写它?对于该特定字符串,ColdFusion替换函数将实现您的目标
<cfscript>
oriString = '[{
"Emails":"10@xyz.com"
},
{
"Emails":"20@xyz.com"
},
{
"Emails":"30@xyz.com"
},
{
"Emails":"40@xyz.com"
}]';
newString = replace(oriString, chr(13), '', 'all');
newString = replace(newString, chr(10), '', 'all');
newString = replace(newString, ' ', '', 'all');
newString = replace(newString, '"},{"Emails":"', chr(10) , 'all');
</cfscript>
<hr>
<cfoutput>
<pre>
ori
#oriString#
new
#newString#
</pre>
</cfoutput>
奥里斯特林酒店[{
“电子邮件”:10@xyz.com"
},
{
“电子邮件”:20@xyz.com"
},
{
“电子邮件”:30@xyz.com"
},
{
“电子邮件”:40@xyz.com"
}]';
newString=replace(或string,chr(13),“全部”);
newString=replace(newString,chr(10),“全部”);
newString=replace(newString,,'',all');
newString=replace(newString,“},{Emails:”,chr(10),'all');
奥里
#奥里斯特林#
新的
#新闻字符串#
您可以在以下位置测试该代码
在现实生活中,您可能不必替换原始字符串中的空白,这取决于它是如何生成的。对于该特定字符串,ColdFusion replace函数将实现您的目标
<cfscript>
oriString = '[{
"Emails":"10@xyz.com"
},
{
"Emails":"20@xyz.com"
},
{
"Emails":"30@xyz.com"
},
{
"Emails":"40@xyz.com"
}]';
newString = replace(oriString, chr(13), '', 'all');
newString = replace(newString, chr(10), '', 'all');
newString = replace(newString, ' ', '', 'all');
newString = replace(newString, '"},{"Emails":"', chr(10) , 'all');
</cfscript>
<hr>
<cfoutput>
<pre>
ori
#oriString#
new
#newString#
</pre>
</cfoutput>
奥里斯特林酒店[{
“电子邮件”:10@xyz.com"
},
{
“电子邮件”:20@xyz.com"
},
{
“电子邮件”:30@xyz.com"
},
{
“电子邮件”:40@xyz.com"
}]';
newString=replace(或string,chr(13),“全部”);
newString=replace(newString,chr(10),“全部”);
newString=replace(newString,,'',all');
newString=replace(newString,“},{Emails:”,chr(10),'all');
奥里
#奥里斯特林#
新的
#新闻字符串#
您可以在以下位置测试该代码
在现实生活中,您可能不必替换原始字符串中的空白,这取决于它是如何生成的。您可以做的是将原始JSON字符串和
反序列化()
将其转换为ColdFusion对象,然后使用queryNew()将其轻松转换为查询对象
。然后可以使用valueList()
将列转换为逗号分隔的字符串。这是一种只需要两行代码的紧凑解决方案
这里是主要链接
您可以做的是将原始JSON字符串和
反序列化()
将列转换为逗号分隔的字符串。这是一种紧凑的解决方案,只需要两行代码
这里是主要链接
我更喜欢将电子邮件作为“emails”键的子项保存在一个数组中
<cfscript>
result={};
EmailList="";
oriString = '[{
"Emails":"10@xyz.com"
},
{
"Emails":"20@xyz.com"
},
{
"Emails":"30@xyz.com"
},
{
"Emails":"40@xyz.com"
}]';
oriArray=deserializeJson(oriString).toArray();
for (i=1; i <= arrayLen(oriArray);i=i+1) {
emailList=emailList.listAppend(oriArray[i]["Emails"],"#chr(10)#");
};
result["oriString"]=oristring;
result["emailList"]=emailList;
</cfscript>
<cfdump var="#oristring#">
<hr>
<cfdump var="#emailList#">
<hr>
<cfdump var="#result#">
我更喜欢将电子邮件作为“emails”键的子项保存在一个数组中
<cfscript>
result={};
EmailList="";
oriString = '[{
"Emails":"10@xyz.com"
},
{
"Emails":"20@xyz.com"
},
{
"Emails":"30@xyz.com"
},
{
"Emails":"40@xyz.com"
}]';
oriArray=deserializeJson(oriString).toArray();
for (i=1; i <= arrayLen(oriArray);i=i+1) {
emailList=emailList.listAppend(oriArray[i]["Emails"],"#chr(10)#");
};
result["oriString"]=oristring;
result["emailList"]=emailList;
</cfscript>
<cfdump var="#oristring#">
<hr>
<cfdump var="#emailList#">
<hr>
<cfdump var="#result#">
我不知道我是否理解你的意思,但我会怎么做:
结果={};
EmailList=“”;
奥里斯特林酒店[{
“电子邮件”:10@xyz.com"
},
{
“电子邮件”:20@xyz.com"
},
{
“电子邮件”:30@xyz.com"
},
{
“电子邮件”:40@xyz.com"
}]';
oriArray=反序列化JSON(oriString.toArray();
对于(i=1;i我不知道我是否正确理解你,但是关于:
结果={};
EmailList=“”;
奥里斯特林酒店[{
“电子邮件”:10@xyz.com"
},
{
“电子邮件”:20@xyz.com"
},
{
“电子邮件”:30@xyz.com"
},
{
“电子邮件”:40@xyz.com"
}]';
oriArray=反序列化JSON(oriString.toArray();
因为(i=1;i他们说,给一个人鱼,你喂他们一天。教他们钓鱼,你喂他们一辈子。下面是一个鼓励重复使用的答案:
字符串函数convertCompositeStructJSONToSingleStructJSON(字符串compositeStructJSON){
//将JSON反序列化为结构数组
arrayFromJSON=反序列化JSON(arguments.compositeStructJSON);
//任何结构的键都是公共键;取第一个
commonStructKey=listGetAt(structKeyList(arrayFromJSON[1]),1);
//基于JSON中的数组组合新数组
newArray=arrayNew(1);
//作为第一个数组元素的公共键
newArray[1]='[{“#commonStructKey:”;
//用相应的结构值填充数组
arrayMap(arrayFromJSON,函数(structItem){
arrayAppend(newArray,structFind(structItem,commonStructKey))
});
//转换为列表,在项目之间添加chr(10)分隔符
newListFromArray=arrayToList(newArray,chr(10));
//追加JSON结尾作为最后一个列表元素
newListFromArray=newListFromArray&'“}]';
//返回一个JSON字符串作为结果
返回newListFromArray
}
//提醒:在ColdFusion中,[]表示数组;JSON表示字符串
原始的[{
“电子邮件”:10@xyz.com"
},
{
“电子邮件”:20@xyz.com"
},
{
“电子邮件”:30@xyz.com"
},
{
“电子邮件”:40@xyz.com"
}]';
//调用函数
newJSON=convertCompositeStructJSONToSingleStructJSON(原始JSON);
writeoutput(newJSON)
他们说,给一个人鱼,你喂他一天。教他钓鱼,你喂他一辈子。下面是一个促进重用的答案:
字符串函数convertCompositeStructJSONToSingleStructJSON(字符串compositeStructJSON){
//将JSON反序列化为结构数组
arrayFromJSON=反序列化JSON(arguments.compositeStructJSON);
//任何结构的键都是公共键;取第一个
commonStructKey=listGetAt(structKeyList(arrayFromJSON[1]),1);
"Emails": deserializeJSON(origJSON).reduce(function(result=[], value){
return result.append(value.emails);
}).toList(chr(10))
<cfscript>
result={};
EmailList="";
oriString = '[{
"Emails":"10@xyz.com"
},
{
"Emails":"20@xyz.com"
},
{
"Emails":"30@xyz.com"
},
{
"Emails":"40@xyz.com"
}]';
oriArray=deserializeJson(oriString).toArray();
for (i=1; i <= arrayLen(oriArray);i=i+1) {
emailList=emailList.listAppend(oriArray[i]["Emails"],"#chr(10)#");
};
result["oriString"]=oristring;
result["emailList"]=emailList;
</cfscript>
<cfdump var="#oristring#">
<hr>
<cfdump var="#emailList#">
<hr>
<cfdump var="#result#">
<cfscript>
string function convertCompositeStructJSONToSingleStructJSON (string compositeStructJSON) {
// Deserialize the JSON to an array of structs
arrayFromJSON=deserializeJson(arguments.compositeStructJSON);
// The key of any of the structs is the common key; take the first
commonStructKey=listGetAt(structKeyList(arrayFromJSON[1]),1);
// Compose new array based on array from JSON
newArray=arrayNew(1);
// Common key as first array element
newArray[1]='[{"#commonStructKey#":"';
// Fill out array with the respective struct values
arrayMap(arrayFromJSON, function(structItem){
arrayAppend(newArray, structFind(structItem, commonStructKey))
});
// Convert to list, adding chr(10) delimiter between the items
newListFromArray=arrayToList(newArray, chr(10));
// Append JSON ending as last list element
newListFromArray=newListFromArray & '"}]';
// Return a JSON string as result
return newListFromArray
}
// Reminder: in ColdFusion, [] signifies an array; JSON is a string
originalJSON='[{
"Emails":"10@xyz.com"
},
{
"Emails":"20@xyz.com"
},
{
"Emails":"30@xyz.com"
},
{
"Emails":"40@xyz.com"
}]';
// Call function
newJSON = convertCompositeStructJSONToSingleStructJSON(originalJSON);
writeoutput(newJSON)
</cfscript>