4

我有一个客户使用 JSON 来表示对象。例如:

var person = {
  fname: "John",
  lname: "Doe",
  nicknames: ["jake", "kevin"]
}

出于编辑这些条目的目的,我们希望为每个对象包括 GUIDS。尚未建立嵌入 GUID 的方法。我目前正在考虑做这样的事情:

var person = {
  _guids: {
    fname: "XXX",
    lname: "XXX",
    _nicknames: "XXX", /* This GUID corresponds to the nickname container */
    nicknames: ["jake-guid", "kevin-guid"],
  }
  fname: "John",
  lname: "Doe",
  nicknames: ["jake", "kevin"]
}

如果每个项目都是它自己的对象,它会变得非常混乱,并且在不需要 GUID 的情况下会禁止干净的交换。然而,这种方法也导致了如何处理这样的事情的问题:

var person = {
  _guids: {
    fname: "XXX",
    lname: "XXX",
    sacks_of_marbles: ["container-guid",
                       "first-sacks-guid", ["XXX", "XXX"],
                       "second-sacks-guid", ["XXX", "XXX"]]
  }
  fname: "John",
  lname: "Doe",
  sacks_of_marbles: [["red", "blue-with-swirls"], ["green", "pink"]]
}

关于如何保持清洁、不冗长以及包含 GUID 的能力的任何建议?

4

3 回答 3

2

在我看来,最干净的“识别策略”是,首先只包含相关的标识符,其次将这些标识符包含在对象的范围内。

fname在你的情况下,如果我知道这一点并lname需要他们自己的标识符,我会感到非常震惊。它们是单个person对象或记录的属性或属性。将person可能有一个 ID,并且相关的fnamelname值应该很容易被person上下文识别:

var person = {
  id: <guid>,
  fname: "Robert",
  lname: "Marley",
  nicknames: ["Bob Marley"]
};

或者,如果nicknames属性实际上是引用列表,则可能是:

var person = {
  id: <guid>,
  fname: "Robert",
  lname: "Marley",
  nicknames: [{id:<guid>,nickname:"Bob Marley"}]
};

如果出于某种特殊原因,每个名称都是其自己的具有属性和标识符的半独立记录,则将其视为完全限定对象:

var person = {
  id: <guid>,
  fname: {id:<guid>, name:"Robert"},
  lname: {id:<guid>, name:"Marley"},
  nicknames: [ {id:<guid>,nickname:"Bob Marley"} ]
};

虽然这里的第 3 个示例并不十分令人困惑,但它可能比必要的要冗长得多。我强烈建议拍摄第一个示例并让上下文完成它的工作。

于 2013-05-20T21:13:08.503 回答
1

如果您包含所有内容的 GUID,您将不会变得整洁或不冗长!也就是说,一种方法是将您的属性值转换为哈希值,例如

var person = {
    fname: {
        value: "John",
        guid: "..."
    },
    lname: {
        value: "Doe",
        guid: "..."
    }
}

这样做的好处是您可以将 GUID 嵌套在相应值旁边,任意深度。但是,这也会为每次访问对象的值增加一些开销(因为person.fname必须成为person.fname.value,等等)。

于 2013-05-20T18:45:40.567 回答
0

在查看了此处的建议以及用例之后,采用了以下解决方案,并且似乎运行良好。

var person_with_guids = {
  obj:{
    type: "person",
    fname: "fname=guid",
    lname: "lname=guid",
    nicknames: ["larry-guid", "curly=guid", "moe-guid"],
    father: "nick-nolte-guid",
  },
  refs:{
    fname-guid:{
      display: "Johnny",
      edit: "johnny"
    },
    lname-guid:{
      display: "Walker",
      edit: "walker"
    },
    larry-guid:{
      type: "person",
      ...
    }
  }
}

var person_without_guids = {
  fname: "Johnny",
  lname: "Walker",
  nicknames: ["Larry", "Curly", "Moe"],
  father: {fname: "Nick", lname: "Nolte"}
}

无需过多讨论选择的细节,所列方案的优点是允许机器将 guid 版本翻译成 sans-guid 版本。有时需要人类可读的轻量级 JSON,有时甚至需要显示文本和编辑文本之间的细微差别。

同样的事情可以通过使用上面提出的方案来完成,将所有东西都变成一个对象并将 guid 嵌入其中。但是,这样做会导致 guid 包含在已经嵌套的系统中,从而使其更难以直观地解释。为了保持更扁平的表示,选择了查找表方法。

我感谢所有回复的人。

于 2013-05-21T09:26:22.817 回答