将Gremlin-Javascript输出转换为JSON

问题描述

是否存在将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,并且以这种方式使用时不方便。