在coldfusion中有没有json_encode(PHP)的替代?

时间:2013-09-19 14:29:42

标签: php json coldfusion

我使用ColdFusion SerializeJSON(queryname)将我的查询结果转换为json格式,并得到以下结果:

{ 
  "COLUMNS":["ID","TAG","TAG_DESCRIPTION","TYPE"]
  , "DATA": [1,"PHP","PHP is an open-source server-side scripting language widely used in web development.","programming"]
}

但是我想要json这种格式,这就是PHP json_encode($rows)返回的内容:
    

[ { "ID":"1"
    , "0":"1"
    , "tag":"php" 
    , "1":"php","type":"programming"
    , "2":"programming"
    , "tag_description":"PHP is an open-source server-side scripting language widely used in web development."
    , "3":"PHP is an open-source server-side scripting language widely used in web development."
   } 
]

ColdFusion中是否有json_encode(PHP)的替代品?或者我必须手动创建这种json格式吗?

由于

4 个答案:

答案 0 :(得分:4)

不,CFML中的函数不是以PHP决定用来表示其内部数据类型之一的JSON序列化的格式创建JSON数据包,而不仅仅是那里的函数在PHP中以Adobe格式创建JSON,任意决定将其内部数据类型表示为JSON。

你必须自己动手。

JSON json_encode()吐出来有点混乱。使用数字索引和字符串键将键/值加倍的故事是什么?根据你在那里给我们的东西,我无法确定第二排的表现方式。你能给我们几行编码为JSON的相当通用的数据,这样我们就可以看到PHP在做什么了吗?

我确定这只是循环你的CFML记录集的问题,然后每行的列值填充数字/字符串键控属性。不要尝试手工构建JSON,在正确的模式中构建本机CFML结构(或结构数组?),然后使用serializeJson()序列化 。< / p>

抱歉有点模糊。如果你可以通过按照它选择的方式将你的记录序列化来解释PHP的想法,我可以更好地解释CFML逻辑以达到同样的目的。

答案 1 :(得分:3)

<cfquery name="getQuery" datasource="tags_dsn" dbtype="ODBC" >  
                select field1, field2 from tablename
</cfquery>

如果我使用的是SerializeJSON(getQuery),请获取以下json格式输出:

{"COLUMNS":["ID","NAME"],"DATA":[[1,"ABC"],[2,"Imperial"]]}

<!---Instead of using SerializeJSON(getQuery) to Change the getQuery result to json i am using the below way.--->

<cfset var aTmp = arraynew(1)>
<cfif #getQuery.recordcount# gt 0>
    <cfloop query="getQuery">
        <cfset coInfo = StructNew()>
        <cfset coInfo["id"]="#getQuery.field1#">
        <cfset coInfo["name"]="#getQuery.field2#">
        <cfset arrayAppend(aTmp,coInfo)>
    </cfloop>
<cfset jsondata =  SerializeJSON(aTmp)>
<cfoutput>#jsondata#</cfoutput>
</cfif>

这样输出json是:

[{"name":"ABC","id":1},{"name":"Imperial","id":2}] 

答案 2 :(得分:1)

如果你有CF11:

 <cfcomponent>
    <cfprocessingDirective pageencoding="utf-8">
    <cfset this.name = "Curso">
    <cfset this.serialization.preservecaseforstructkey = true   >
    <cfset this.serialization.serializeQueryAs = "struct">
    </cfcomponent>

您将在cfm / cfc中使用serializeJSON(查询)。或者:

<cffunction name="estructura" access="remote"  returntype="any" >
<cfargument name="query" type="query" required="true" >

    <cfset columns = arguments.query.ColumnList>
    <cfset array = ArrayNew( 1 )>
        <cfloop query="#arguments.query#">
            <cfset query_ = structNew()>
            <cfloop list="#columns#" index="col">
                <cfset query_[lcase(col)] = arguments.query[col][arguments.query.CurrentRow]>
            </cfloop>
            <cfset array[arguments.query.CurrentRow] = query_>
        </cfloop>

<cfset data.data = array>

<cfreturn data>

</cffunction>
<cffunction name="prueba" access="remote" returntype="any" returnformat="JSON">

    <cfquery name="query">
        select * from rsosa.colaboradores
    </cfquery>


    <cfreturn estructura(query)>


</cffunction>

答案 3 :(得分:0)

您可以签出我的jQuery插件来解析本机CF Query返回。您可以对CFC进行本机远程调用,在ColdFusion的本机JSON解析中获取数据(使用ajax请求中的returnFormat:'json'选项),然后通过此插件传递结果以获取标准名称/值格式你期待在许多其他jQuery(和其他)插件中。我也有类似ExtJS数据存储的解析器。

https://github.com/cutterbl/serializeCFJSON