将json键映射到javascript对象

时间:2019-10-01 20:44:13

标签: javascript json google-closure-compiler

我需要将json文件解析为javascript对象。我正在使用GCC(Closure Compiler),它可能会破坏我的对象名称,因此在导入或导出json文件时,我需要将json键作为字符串引用。

即导入:

var jsonobj = JSON.parse(json_object_text);
myobj.member1 = jsonobj['Key 1'];
myobj.member2 = jsonobj['Key 2'];

并导出:

jsonobj['Key 1'] = myobj.member1;
jsonobj['Key 2'] = myobj.member2;
var json_object_text = JSON.stringify(jsonobj);

但是这样做很乏味。而且我只想将键定义为文本字符串一次。

因此,我试图定义一个常量对象,该对象是一种从javascript对象到json模式的映射。

// Schema definition for import/export of confc.json.
/** @const */ var dbs = {
    $schema: '$schema',
    $seq: '$seq',
    channel: {
      key: 'chan',
      id: 'id',
      name: 'txt',
      value: 'val'
    }
}

但是随后我仍然必须执行繁琐的导入/导出功能:

    export_db: function (db) {
      return db && {
        [dbs.$schema]: db.$schema,
        [dbs.$seq]: db.$seq,
        [dbs.channel.key]: db.channel.map(function (e, i) {
          var s = dbs.channel; // schema object
          return {
            [s.id]: util.toInt(e.id),
            [s.name]: e.name,
            [s.value]: e.value
          };
        }),
    import_db: function (js) {
      js = js || {};
      // wrapper for .map() function which works if array is undefined.
      function dbmap(arr_in, func) {
        arr_in = arr_in || [];
        return arr_in.map(func);
      }
      return {
        $schema: js[dbs.$schema],
        $seq: js[dbs.$seq],
        channel: dbmap(js[dbs.channel.key], function (e, i) {
          var s = dbs.channel;
          return {
            id: e[s.id],
            name: e[s.name],
            value: e[s.value]
          };
        }),

这似乎可以正常工作,但是有人可以告诉我一种更清洁的方法吗?

我想使用given here示例中的对象原型/构造函数。但是我看不到任何示例考虑到GCC如何处理对象成员名称。另外,我还有嵌套的对象(没有功能,只有文本和数字)。

2 个答案:

答案 0 :(得分:1)

如果数据源是外部的,或者需要外部共享数据,则Closure通过externs@export annotations支持此方式。 User contributed externs是很好的例子。

根据您的环境,它可能看起来像这样;

// externs / config.js

for k in children_struct["root"]["children"].keys():
    print(k)

// main.js

/**
 * @typedef {{
 *   foo: (string|undefined),
 *   [...]
 * }}
 */
Bar.Config;

/**
 * @typedef {{
 *   bar: (string|undefined),
 *   [...]
 * }}
 */
Bar.Output;

答案 1 :(得分:0)

JSON本质上已经是对象格式(JSON = JavaScript Object Notation)。

var jsonobj = JSON.parse(json_object_text)应该是访问刚创建的名为jsonobj的对象所需要的。可以访问该对象的任何成员,就像您在构造函数中或其他任何地方定义它们一样。您有理由将其重新映射到其他对象吗?