0

関数に渡す JSON 文字列があります。文字列は動的に生成され、異なる「名前」パラメータを含む場合があります。次のようになります (読みやすいように書式設定されています)。

<cfset x = "
    series: [
       {
           name:inbounds,
           data:
              [
                 [Date.UTC(2012,4,1),0],
                 [Date.UTC(2012,4,2),0],
                 [Date.UTC(2012,4,3),0]
              ]
       },
       {
           name:outbounds,
           data:
              [
                 [Date.UTC(2012,4,1),0],
                 [Date.UTC(2012,4,2),0],
                 [Date.UTC(2012,4,3),0]
              ]
       },
       {
           name:api,
           data:
              [
                 [Date.UTC(2012,4,1),441],
                 [Date.UTC(2012,4,2),441],
                 [Date.UTC(2012,4,3),443]
              ]
       },
       {
           name:excess,
           data:
              [
                 [Date.UTC(2012,4,1),0],
                 [Date.UTC(2012,4,2),0],
                 [Date.UTC(2012,4,3),0]
              ]
       }
    ] 
">

ただし、「name」パラメーターの値を一重引用符で囲む必要があります。たとえば、の代わりにname:inbounds、必要なname:'inbounds' ので、この文字列を検索して名前パラメーターを見つけ、その値を一重引用符で囲む必要があります。

編集

このようにしている理由は、配列で serializeJSON を呼び出した後、次のものが生成されるためです (スナップショットの略)。

[{"NAME":"Excess","DATA":[["Date.UTC(2012,5,1)",0],......

CF はすべてを二重引用符で囲みます。私が使用している Highcharts API は、このようなことを望んでいません。だから、私は二重引用符を取り除きます

<cfset x = replace(x, """", "", "all")>

次に、文字列変数に一重引用符を追加する必要があります。

より良い方法があれば、私はそれを受け入れます。

4

3 に答える 3

4

「文字列は動的に生成されます」 .

この時点で一重引用符を追加します。


(問題がある場合は、そのコードを投稿してください。問題を解決できます。)

後で正規表現でそれを行うことは理想的な解決策ではありません。


更新:これで、あなたが実際に何をしているかについての詳細情報が得られました...

CF データを Highcharts で使用する JS 文字列に変換するコードの概念実証を次に示します。

これは部分的な解決策です - 私はHighcharts API全体を調べていません。以下のコードの一部は半分しか実装されておらず、一部のビットは別の方法で実行する必要があるかもしれませんが、一般的にはこれがどのように機能するかについてのアイデアを与えるはずです.

あなた (および/または他の誰か) が以下のコードを取得して highcharts.cfc に展開したい場合は、CFML コミュニティにとって役立つものであると確信しています...


コード:

<cffunction name="convertToHighchartsJs" returntype="String" output=false >
    <cfargument name="CfData" type="Struct" required />

    <cfif NOT StructKeyExists(Arguments.CfData,'Series')>
        <cfthrow message="Does not look like Highcharts data" />
    </cfif>

    <cfreturn "series:#serializeForHighcharts(Arguments.CfData.Series)#" />
</cffunction>


<cffunction name="serializeForHighcharts" returntype="String" output=false >
    <cfargument name="Data"       type="any"    required />
    <cfargument name="Name"       type="String" optional />
    <cfargument name="ParentName" type="String" optional />

    <cfset var JsString = "UNABLE TO SERIALIZE" />

    <cfif isStruct(Arguments.Data) >
        <cfsavecontent variable="JsString"><cfoutput><!---
            --->{<!---
                ---><cfloop item="local.CurItem" collection=#Arguments.Data#><!---
                    --->,#fixCase(CurItem)#:#serializeForHighcharts(Arguments.Data[CurItem],CurItem)#<!---
                ---></cfloop><!---
            --->}<!---
        ---></cfoutput></cfsavecontent>

        <cfset JsString = rereplace(JsString,'^\{,','{') />

    <cfelseif isArray(Arguments.Data) >

        <cfsavecontent variable="JsString"><cfoutput><!---
            --->[<!---
                ---><cfloop index="local.CurItem" array=#Arguments.Data#><!---
                    --->,#serializeForHighcharts(CurItem)#<!---
                ---></cfloop><!---
            --->]<!---
        ---></cfoutput></cfsavecontent>

        <cfset JsString = rereplace(JsString,'^\[,','[') />

    <cfelseif isSimpleValue(Arguments.Data) >

        <cfset var ShouldBeQuoted = false />

        <cfif StructKeyExists(Arguments,'Name')>
            <cfif ListFindNoCase('name,text,renderTo,type,color,layout,align,verticalalign',Arguments.Name)>
                <cfset ShouldBeQuoted = true />
            </cfif>

        <cfelseif StructKeyExists(Arguments,'ParentName') AND ListFindNoCase('categories',Arguments.ParentName) />
            <cfset ShouldBeQuoted = true />

        </cfif>

        <cfif ShouldBeQuoted >
            <cfset JsString = "'" & JsStringFormat(Arguments.Data) & "'" />
        <cfelse>
            <cfset JsString = Arguments.Data />
        </cfif>

    </cfif>

    <cfreturn JsString />
</cffunction>


<cffunction name="fixCase" returntype="String" output="false" access="private">
    <cfargument name="Text" type="String" required />

    <cfif NOT StructKeyExists(Variables,'Camels')>
        <cflock type="exclusive" name="regen_camels" timeout=10>
            <cfset Variables.Camels = StructNew() />
            <cfloop index="CurCamel" list="dataParser,dataURL,legendIndex,xAxis,yAxis">
                <cfset Variables.Camels[CurCamel] = CurCamel />
            </cfloop>
        </cflock>
    </cfif>

    <cfif StructKeyExists(Variables.Camels,Arguments.Text)>
        <cfreturn Variables.Camels[Arguments.Text] />
    <cfelse>
        <cfreturn Lcase(Arguments.Text) />
    </cfif>

</cffunction>

テスト:

<cfset CfData =
    { 'Series':
        [
            { 'name':'inbounds'
            , 'data':
                [ ['Date.UTC(2012,4,1)',0]
                , ['Date.UTC(2012,4,2)',0]
                , ['Date.UTC(2012,4,3)',0]
                ]
            }
        ,
            { 'name':'outbounds'
            , 'data':
                [ ['Date.UTC(2012,4,1)',0]
                , ['Date.UTC(2012,4,2)',0]
                , ['Date.UTC(2012,4,3)',0]
                ]
            }
        ]
    } />

<cfset Expected = "series:[{name:'inbounds',data:[[Date.UTC(2012,4,1),0],[Date.UTC(2012,4,2),0],[Date.UTC(2012,4,3),0]]},{name:'outbounds',data:[[Date.UTC(2012,4,1),0],[Date.UTC(2012,4,2),0],[Date.UTC(2012,4,3),0]]}]" />


<cfset JsString = convertToHighchartsJs(CfData) />

<cfif JsString EQ Expected>
    <h1 style="color:green">Matches</h1>
<cfelse>
    <h1 style="color:red">different</h1>
</cfif>

<cfdump var=#{Received:JsString,Expected:Expected}# />
于 2012-07-14T11:50:25.173 に答える
1

正規表現で行う必要がある場合、これは機能するはずです

reReplace(json, "\bname\b.*?:([^,]+)", "name:'\1'", "All")
于 2012-07-14T15:00:46.400 に答える
0

x ここでの問題の根本的な原因は、変数にある文字列が JSON ではないことだと思います: JSON スキーマに準拠していません。

したがって、ここで行う最善の方法は、事後に修正しようとするのではなく、最初から整形式であることを確認することです。

@Peterが触れたように、文字列の作成を制御している場合は、最初から正しく実行してください。サードパーティから入手した場合は、サードパーティに連絡してこれを指摘すると、修正される可能性があります.

JSONLintを使用して文字列を検証し、正しいことを確認できます。

于 2012-07-15T08:05:12.450 に答える