Coldfusion 合并具有相同密钥的两个JSON对象

Coldfusion 合并具有相同密钥的两个JSON对象,coldfusion,deserialization,lucee,Coldfusion,Deserialization,Lucee,我有这样的JSON [{ "Emails":"10@xyz.com" }, { "Emails":"20@xyz.com" }, { "Emails":"30@xyz.com" }, { "Emails":"40@xyz.com" }] 输

我有这样的JSON

[{
      "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”键的子项保存在一个数组中

  • 反序列化原始数组
  • 在阵列上运行并创建电子邮件阵列
  • 再次序列化整个数组
  • 以下内容适用于lucee和更新版本的ACF

    <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”键的子项保存在一个数组中

  • 反序列化原始数组
  • 在阵列上运行并创建电子邮件阵列
  • 再次序列化整个数组
  • 以下内容适用于lucee和更新版本的ACF

    <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>