Javascript 为什么以及何时需要展平JSON对象?

Javascript 为什么以及何时需要展平JSON对象?,javascript,json,flatten,Javascript,Json,Flatten,我很惊讶StackOverflow上以前没有人问过这个问题 浏览JSON对象文档和快速的google搜索并没有得到令人满意的结果 它的优点是什么?它是如何工作的 编辑:为了清楚起见,请看一下这个展平/取消展平示例 谢谢。在很多情况下,您会得到一些库自动生成的JSON文本。在所有编程语言中,都有许多构建JSON文本的库(一个) 每当库添加一些额外的对象或数组包装时,您可能希望删除它们,这可能是因为您将JSON发送到服务器,那里的代码会崩溃,因为它需要一个基本值而不是一个对象(或数组)。或者,如

我很惊讶StackOverflow上以前没有人问过这个问题

浏览JSON对象文档和快速的google搜索并没有得到令人满意的结果

它的优点是什么?它是如何工作的


编辑:为了清楚起见,请看一下这个展平/取消展平示例


谢谢。

在很多情况下,您会得到一些库自动生成的JSON文本。在所有编程语言中,都有许多构建JSON文本的库(一个)

每当库添加一些额外的对象或数组包装时,您可能希望删除它们,这可能是因为您将JSON发送到服务器,那里的代码会崩溃,因为它需要一个基本值而不是一个对象(或数组)。或者,如果JSON是服务器响应,则不希望生成的Javascript代码在对象/数组与非对象/数组之间有所不同。在所有这些情况下,展平都很有帮助,因为它会节省您的时间。您必须实现较小的if/else,并且您可以可靠地期望您的数据结构尽可能平坦

为上述场景改进代码的另一种方法是以一种最健壮的方式编写代码,这样它就不会因为多余的包装而崩溃。所以,总是期待一些包装,并得到它的内容。然后,不需要展平

你看,这取决于构建JSON的内容和解析JSON的内容。这座大楼可能不在你的范围之内

这也导致了数据模型问题。我使用过XML代码,如果某个XY的条目为0,或者某个XY的条目大于0,则需要以不同的方式对其进行解析。使用允许0个或多个XY条目的包装器将使live更容易。这些是数据模型决策


在JSON表示我手动组合的对象结构的所有情况下,我希望它不会改变。所以,将我设计的细节展平会令人不安。据我所知,标准操作不需要扁平化(例如,
JSON.stringify()
JSON\u encode()
等)

这里有一个简单的场景:在web应用程序中,您有一个HTTP POST正在更新复杂的关系对象

POST
update=1
&user.id=12345
&user.email=testmail@domain.tld
&user.profile.name=Mr. Test
&user.profile.age=42
&user.profile.friend.0.email=tom@domain.tld
&user.profile.friend.1.email=sally@domain.tld
&user.profile.friend.2.email=bob@domain.tld
&user.profile.skill.0.id=100
&user.profile.skill.0.name=javascript
&user.profile.skill.1.id=200
&user.profile.skill.1.name=piano
所有的东西都已经在一个平面结构中了,那么为什么不进行简单的一对一绑定呢?如果您有一个需要强制执行的约束或安全要求列表,您可以通过直接搜索排序的密钥列表来验证它们

扁平结构更易于人们理解和使用,甚至与数据库去规范化有一些交叉。它还允许以可读但更详细的方式实现特定于上下文的安全性和约束

完整显示用户视图时,您可能希望隐藏用户技能列表的主键ID的显示

"user.profile.skill.#.id": { hidden: true, readonly: true }
但是,当直接查看某项技能时(可能以管理员的身份对其进行编辑),您可能希望看到ID

"skill.id": { readonly: true }
如果您正在编写一个以用户为中心/自助服务类型的CMS应用程序,那么与仅使用嵌套模型相比,您将获得更多的用户,并且能够使用简单的平面模型(底层嵌套关系模型的平面抽象)做出贡献


TLDR:Flat比嵌套更容易阅读。程序员可以处理嵌套模式、递归解析和处理;最终用户和管理员通常更喜欢抽象出来的部分。

我意识到这是一个5年前的问题,但我想,我会补充我的想法,以防有人遇到类似的用例并发现这很有用


您希望展平JSON对象的一个用例是通过正则表达式(RegEx)字符串插值进行动态模板绑定。那不是一口吗?你是说迷你?减少文件大小,节省磁盘空间或带宽(通常是带宽)。您指的是哪个JSON库?如下所示:无需按链接中所述“展平”JSON。(事实上,这有点与JSON的“哲学”相反。)有时JSON的构造很差,有多余的“对象”层,但引用的示例并非如此。(尽管我认为在某些Javascript场景中,所描述的“扁平化”可能很有用,与Javascript API的关系比与JSON本身的关系更大。)我在您提到的问题中请OP加入这个问题。也许他能启发我们。