我需要将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如何处理对象成员名称。另外,我还有嵌套的对象(没有功能,只有文本和数字)。
答案 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
的对象所需要的。可以访问该对象的任何成员,就像您在构造函数中或其他任何地方定义它们一样。您有理由将其重新映射到其他对象吗?