保存Javascript对象

时间:2013-04-09 14:02:27

标签: javascript json

我有javascript对象树。我们称之为“家庭”。它可以包含任意数量的特定对象("父母和#34;),每个对象可以包含任意数量的" child"对象。此结构中的级别数是已知的,树的每个级别仅包含一种特定类型的对象。

所有对象都有数据和方法。

我想在数据库中保存结构化数据。 JSON.stringify()完美地提取数据并保存结构。但是如何回到对象? JSON.parse()失败,因为它在没有方法的情况下重新创建对象。

在这种情况下我该怎么办?我应该编写自己的函数来从字符串重新创建对象吗?或者我应该以某种方式将数据与方法一起保存(似乎是浪费)。

正如我所知道的结构,如果有可能指向一个对象并告诉他们这是一个父对象"它会非常方便。它会得到方法。那时我可以轻松地循环。但我不知道如何做到这一点,我也害怕我的构造函数可以设置一些默认值。

对象构造函数看起来像这样:

function lines()
{
    this.lines = [];
    this.height = 0.5*theMargin;

    this.addLine = addLine;

    function addLine(newline)
    {
        this.lines.push(newline);
        this.height += newline.height;
    }
}

function aLine()
{
    this.dots = [];
    this.height = 0;
    this.length = indent;

    this.insertDot = insertDot;

    function insertDot(pos,newDot)
    {
        this.dots.splice(pos,0,newDot);
        this.length += newDot.length;
        this.height = Math.max(this.height,newDot.height);
        if (this.length > maxLineLength)
        { "I will not go into details here" }
    }
}

然后我会这样做:

var a = new lines();
var testline = new aLine();
var testdot = new aDot();

testdot.height = 10;
testdot.length = 15;
testline.insertDot(0,testdot);
a.addLine(testline);
a.addLine(testline);

然后我想保存有关长度和高度的数据。和结构,知道哪一个点属于哪一行。

我将该数据发送到网络服务器。我认为这些是了解使用方法的关键线:

post = "name=" + name + "&tab=" + JSON.stringify(file);
req.open("POST", "saveFile.php", true);
req.send(post);

保存的文件完全保存了我想要的内容 - 结构和数据。但我不知道如何让它再次成为一个对象。我不是坚持使用JSON.stringify()方法。我会喜欢任何可以让我保存内容而无需反复保存方法的方法。

2 个答案:

答案 0 :(得分:1)

如果您真的因为某种原因而痴迷于保存整个对象的想法,那么我建议你使用toString()方法,它实际上会在调用时以字符串的形式返回函数的代码体。功能

var obj = { func: function() { alert('hello!'); };
for(var key in obj)
    if (typeof obj[key] === 'function')
       alert(obj[key].toString());

除了json数据之外,您还必须添加代码来序列化和存储此信息。

所有这一切,你真的应该只是存储对象的状态并将它们重新加载到你的应用程序中。

编辑:重建对象客户端

免责声明:我不是一个PHP人员,所以你只能找到一个实际编码的例子,但我相信那里有一个充满了全能Google的力量。

您只需使用序列化/反序列化类将数据序列化回您的对象。 因此,假设伪代码部分是特定页面的php文件:

<?php
 <html>
      <head>
          <script type="text/javascript">
              var model = /* Use serializing class on your server-side object */;
              //Now you just need to build a function into your objects that is much like a constructor that can receive this model and rebuild the object

              function rebuildObject(yourObject, jsonModel) {
                  //assign first property
                  //assign second etc...
              }
           </script>
      </head>
      <body>
      </body>
</html>
?>

您实际上是将json数据模板化回脚本标记中的页面,以便您可以在客户端访问它。 javascript解释器会自动将json转换为您的代码可以使用的实际js对象,因此没有问题。

答案 1 :(得分:1)

最后,我选择了直接的方式来重新创建所有对象并复制数据。事实证明它比我之前想象的更短更好。如果它对其他人有用,我就是这样做的:

data = JSON.parse(file);
a = new lines();

a.height = data.height;

for (var i=0; i<data.lines.length; i++)
{
    a.lines.push(new aLine());
    a.lines[i].height = data.lines[i].height;
    a.lines[i].length = data.lines[i].length;
    for (var j=0; j<data.lines[i].dots.length; j++)
    {
        a.lines[i].dots.push(new aDot());
        [... and so on ...]
    }
}