Я пишу свой первый API-интерфейс REST с поддержкой ORM и имею некоторые проблемы с сериализацией 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;
}
}
Это базовая сущность, которую она расширяет (среди прочего, для 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()
во 2-м фрагменте кода, что я пытаюсь решить эту проблему путем добавления значения всех свойств идентификатора (у каждого объекта есть свойство с именем "id") в целое число. Это не работает Я также попробовал 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":"-"}]
Я в растерянности. Что мне не хватает? Почему это не работает?