lugar na corda json com Coldfusão

Isto não funciona. O json é válido. Gostaria, eventualmente, de substituir qualquer Distributor_ID: 100 por Distributor_ID: 55. Pode haver qualquer número de itens aninhados no json e o caminho para Distributor_ID pode variar. Se fosse deserializado para uma estrutura Primeiro, eu teria que procurá-lo por caminho e substituir em todos os lugares que foi encontrado. Pensei que uma vez que o json é uma string, então um simples substituto poderia fazê-lo rapidamente, mas eu tenho um erro:

Invalid token " found.
Como substituir rapidamente um valor em JSON serializado? com CF? Uma citação ou apóstrofo precisa ser escapada?

<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#">
Author: Matt Busche, 2014-04-10

1 answers

Não use funções de substituição de texto no JSON. O JSON não é uma corda.

O JSON é uma estrutura de dados. Trata-o como tal.

<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)>
 6
Author: Tomalak, 2014-04-10 13:40:45