JSON最佳实践:包含数据的GUIDS

时间:2013-05-20 18:37:42

标签: json

我有一个使用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的能力的任何建议?

3 个答案:

答案 0 :(得分:2)

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

在您的情况下,我真的很震惊地得知fnamelname需要自己的标识符。它们是单个person对象或记录的属性或属性。 person可能会有一个ID,并且fname上下文应该可以轻松识别相关的lnameperson值:

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"} ]
};

虽然这里的第三个例子并不是非常令人困惑,但它可能比必要的要冗长得多。我强烈建议拍摄第一个例子并让上下文做它的工作。

答案 1 :(得分:1)

如果你为所有事情都包括GUID,你就不会得到清洁或缺乏冗长!也就是说,一种方法是将属性值转换为像

这样的哈希值
var person = {
    fname: {
        value: "John",
        guid: "..."
    },
    lname: {
        value: "Doe",
        guid: "..."
    }
}

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

答案 2 :(得分: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嵌入其中,可以实现同样的事情。但是,这样做会导致guids被包含在已经嵌套的系统中,这使得在视觉上更难以解释。为了保持更扁平的表示,选择了查找表方法。

感谢所有回复的人。