使用ColdFusion重新放置在json字符串上

时间:2014-04-10 13:20:34

标签: json coldfusion replace

这不起作用。 json是有效的。我希望最终用Distributor_ID替换任何Distributor_ID:100:55。json中可能有任意数量的嵌套项目,Distributor_ID的路径可能会有所不同。如果它首先被反序列化为一个结构,我将不得不通过路径搜索它并替换它找到的任何地方。我认为既然json是一个字符串,那么一个简单的替换可以快速完成,但我收到一个错误:

Invalid token " found.

如何用CF快速替换序列化json中的值?报价或撇号是否需要转义?

<cfset jsonstring= '"SUPPLY": [
{
    "SRole_ID": 1,
    "Distributor_ID": 100,
    "Test": "E974564E-B252-148D-E6FD5EF429885236"
},
{
    "SRole_ID": 1,
    "Distributor_ID": 100,
    "Test": "EC08B56C-95BE-0DCA-DD7789978A05D788"
},
{
    "SRole_ID": 1,
    "Distributor_ID": 13,
    "Test": "EC0BA1FB-F6A7-29E3-CC92FD509BCD487C"
},
{
    "SRole_ID": 1,
    "Distributor_ID": 15,
    "Test": "EC0FEC88-018E-CCEA-668038434E83A4E7"
}
]'>
<cfset newjson =  ReplaceNoCase(jsonstring, 'Distributor_ID": 100', 'Distributor_ID": 50', "ALL")>
<cfdump var="#newjson#">

1 个答案:

答案 0 :(得分:6)

不要在JSON上使用字符串替换功能。 JSON不是字符串。

JSON是一种数据结构。这样对待它。

<cfset jsonstring = '{ 
"SUPPLY": [
    {
        "SRole_ID": 1,
        "Distributor_ID": 100,
        "Test": "E974564E-B252-148D-E6FD5EF429885236"
    },
    {
        "SRole_ID": 1,
        "Distributor_ID": 100,
        "Test": "EC08B56C-95BE-0DCA-DD7789978A05D788"
    },
    {
        "SRole_ID": 1,
        "Distributor_ID": 13,
        "Test": "EC0BA1FB-F6A7-29E3-CC92FD509BCD487C"
    },
    {
        "SRole_ID": 1,
        "Distributor_ID": 15,
        "Test": "EC0FEC88-018E-CCEA-668038434E83A4E7"
    }
  ]
}'>

<cfset data = DeserializeJSON(jsonstring)>

<cfloop array="#data.SUPPLY#" index="item">
  <cfset item["Distr"] = item["Distributor_ID"]>
  <cfset StructDelete(item, "Distributor_ID")>
</cfloop>

<cfset newjson = SerializeJSON(data)>