问题描述
是否存在将Gremlin-Javascript的响应转换为JSON的内置方法?看来结果是 Map 或一组Map,具体取决于遍历。
现在,我们正在深入检查类型并使用Object.fromEntries(如果它是地图)。
谢谢!
解决方法
我也在为此苦苦挣扎。
我当前的解决方案是转换结构:
normalizeData(gremlinData: Map<string,any>) {
// Do this so that JSON.stringify works for maps
(Map.prototype as any).toJSON = function () {
return Object.fromEntries(this);
};
const mapStrippedData = JSON.parse(JSON.stringify(gremlinData));
// Undo it so that we don't permanently pollute globals
(Map.prototype as any).toJSON = undefined;
return mapStrippedData;
}
我真的不喜欢这个解决方案,因为它很慢。就我而言,我正在转换一个非常大的,深层嵌套的对象,必须先JSON.stringify
,然后JSON.parse
,该对象现在才是我API的瓶颈。
如果您可以将gremlin配置为使用其他使用普通JavaScript对象而不是Maps的序列化器/反序列化器,那就太好了。
更新17/12/2020:
最终我发现上述解决方案有点慢,原因是它不得不多次序列化和反序列化,所以我不得不为Mapr的Map序列化器类打补丁。
import { process,driver,structure } from 'gremlin';
// @ts-ignore
import { MapSerializer } from 'gremlin/lib/structure/io/type-serializers';
MapSerializer.prototype.deserialize = function (obj: any) {
const value = obj['@value'];
if (!Array.isArray(value)) {
throw new Error('Expected Array,obtained: ' + value);
}
const result = {};
for (let i = 0; i < value.length; i += 2) {
// @ts-ignore
result[`${this.reader.read(value[i])}`] = this.reader.read(value[i + 1]);
}
return result;
};
const { withOptions,t,P,column,order } = process;
export { driver,structure,withOptions,order,process };
然后,我只是从此文件中导入我的gremlin方法,而不是直接从'gremlin'中导入它,就可以了。
,Gremlin旨在返回容器数据结构,例如列表和地图/字典。它不会以原始JSON的形式返回结果。它可以使用JSON(即GraphSON)作为其序列化格式,但会将该格式反序列化为编程语言的复杂对象。通常,您不希望直接使用GraphSON,因为它具有types embedded within it,并且以这种方式使用时不方便。