我正在编写我的第一个支持ORM的REST api,并且遇到了JSON序列化的一些问题。这是我的一个实体定义:
component persistent="true" extends="Base" {
property name="id"
fieldtype="id"
generator="native"
ormtype="int"
type="numeric";
property name="relationship"
type="string"
ormtype="string";
property name="comment"
type="string"
ormtype="text";
//related entities
property name="termA"
cfc="term"
fieldtype="many-to-one"
fkcolumn="termA"
lazy="false";
property name="termB"
cfc="term"
fieldtype="many-to-one"
fkcolumn="termB"
lazy="false";
//override getMemento to include appropriate relationships
public struct function getMemento(){
//standard stuff
local.memento = super.getMemento();
//custom add-ons
local.memento["termA"] = this.getTermA().getId();
local.memento["termB"] = this.getTermB().getId();
return local.memento;
}
}
这是它扩展的Base实体(对于super.getMemento等):
component extends="core.v1.models.Base" {
public struct function getMemento(){
local.memento = deserializeJson(serializeJson(this));
//fix numerics showing up as strings
if (structKeyExists(local.memento, "id")){
local.memento.id = javacast("int", local.memento.id);
}
return local.memento;
}
public array function transformCollectionIntoMementos(array input){
if (arrayLen(arguments.input) > 0){
for (var i = 1; i <= arrayLen(arguments.input); i++){
arraySet(arguments.input,i,i,arguments.input[i].getMemento());
}
}
return arguments.input;
}
}
此扩展的类与此无关。
最后,这是一个简化版本的代码,用于呈现数据的json表示:
<cfoutput>#serializeJson(transform(entityLoad("interaction")))#</cfoutput>
public array function transform(array input){
if (arrayLen(arguments.input) > 0){
for (var i = 1; i <= arrayLen(arguments.input); i++){
arraySet(arguments.input,i,i,arguments.input[i].getMemento());
}
}
return arguments.input;
}
您可以在第二个代码段中的getMemento()
实现中看到我试图通过将所有ID属性的值(每个实体都有一个名为“id”的属性)javacasting为整数来解决此问题。这不起作用。我也试过了javacast("int", local.memento.id * 1);
,这也不起作用。
无论我尝试过什么,生成的json都是这样的:
[{"termB":"2","termA":"1","id":"1","relationship":"+"},{"termB":"4","termA":"1","id":"3","relationship":"-"}]
我期待的是:
[{"termB":"2","termA":"1","id":1,"relationship":"+"},{"termB":"4","termA":"1","id":3,"relationship":"-"}]
我很茫然。我错过了什么?为什么这不起作用?
答案 0 :(得分:3)
Adobe对serializeJSON进行了哪些更改?
http://coldfusion.tcs.de/adobe-please-fix-coldfusion-serializejson/
答案 1 :(得分:1)
也许你可以使用它:http://jsonutil.riaforge.org/它解决了整数被转换为字符串的问题。