【问题标题】:Edit parsed JSON编辑解析的 JSON
【发布时间】:2009-10-11 14:48:30
【问题描述】:

我有一个 JSON 文件 contact.txt,它已被解析为一个名为 JSONObj 的对象,其结构如下:

[
    {
         "firstName": "John",
         "lastName": "Smith",
         "address": {
             "streetAddress": "21 2nd Street",
             "city": "New York",
             "state": "NY",
             "postalCode": "10021"
         },
         "phoneNumbers": [
             { "type": "home", "number": "212 555-1234" },
             { "type": "fax", "number": "646 555-4567" }
         ]
     },

     {
         "firstName": "Mike",
         "lastName": "Jackson",
         "address": {
             "streetAddress": "21 Barnes Street",
             "city": "Abeokuta",
             "state": "Ogun",
             "postalCode": "10122"
         },
         "phoneNumbers": [
             { "type": "home", "number": "101 444-0123" },
             { "type": "fax", "number": "757 666-5678" }
         ]
     }
]

我设想通过从表单中获取数据来编辑文件/对象,以便添加更多联系人。我该怎么做?

下面添加新联系人到JSONObj的数组的方法好像不行,有什么问题?:

var newContact = {
             "firstName": "Jaseph",
             "lastName": "Lamb",
             "address": {
                 "streetAddress": "25 2nd Street",
                 "city": "New York",
                 "state": "NY",
                 "postalCode": "13021"
             },
             "phoneNumbers": [
                 { "type": "home", "number": "312 545-1234" },
                 { "type": "fax", "number": "626 554-4567" }
             ]
}
var z = contact.JSONObj.length;
contact.JSONObj.push(newContact);

【问题讨论】:

  • 我根据您的回复更新了我的答案。
  • 我更新了我原来的帖子,展示了我是如何尝试操纵 JSON 对象的。

标签: ajax json forms editing


【解决方案1】:

这取决于您使用的技术。基本过程是读取文件,使用 JSON 解析库将其转换为任何本机数据类型(哈希、字典、列表等),修改或添加数据到本机对象,然后将其转换回 JSON 并存储它到文件中。

在 Python 中,使用 simplejson 库会如下所示:

import simplejson

jsonobj = simplejson.loads(open('contact.txt'))

#python's dict syntax looks almost like JSON
jsonobj.append({
     'firstName': 'Steve',
     'lastName': 'K.',
     'address': {
          'streetAddress': '123 Testing',
          'city': 'Test',
          'state': 'MI',
          'postalCode': '12345'
     },
     'phoneNumbers': [
         { 'type': 'home', 'number': '248 555-1234' }
     ]
})

simplejson.dump(jsonobj, open('contact.txt', 'w'), indent=True)

本示例中的数据是硬编码字符串,但它可能来自另一个文件或 Web 应用程序请求/表单数据等。如果您在 Web 应用程序中执行此操作,但我建议您不要读取和写入同一个文件(以防两个请求同时进入)。

如果这不能回答您的问题,请提供更多信息。


回应“没有办法使用标准的javascript做到这一点吗?”:

要在 Javascript 中解析 JSON 字符串,您可以使用 eval 它(不安全)或使用 JSON 解析器,如 this oneJSON.parse。获得转换后的 JSON 对象后,您可以在标准 JS 中对其进行任何修改。然后,您可以使用同一个库将 JS 对象转换为 JSON 字符串 (JSON.stringify)。 Javascript 不允许文件访问(除非你在做serverside JS),所以这会阻止你直接读写你的contact.txt 文件。您必须使用服务器端语言(如 Python、Java 等)来读取和写入文件。

【讨论】:

  • 这正是我想做的,难道没有办法使用标准的javascript来做到这一点吗?
  • 我基本上是在尝试扩展对象的数组。使用 push() 似乎不起作用,什么会起作用?
【解决方案2】:

读入 JSON 后,您将拥有一个关联数组 - 或者更确切地说,您拥有一个伪关联数组,因为这是 Javascript。无论哪种方式,您都可以将其视为一个大字典列表。您可以通过键和索引访问它。

所以,玩这个对象:

var firstPerson = JSONObj[0];
var secondPerson = JSONObj[1];

var name = firstPerson['firstName'] + ' ' + firstPerson['lastName'];

由于您通常会有两个以上的人,您可能只想遍历列表中的每个字典并做一些事情:

for(var person in jsonList) {

  alert(person['address']);

}

如果要编辑 JSON 并将其保存回文件,则将其读入内存,编辑字典列表,然后重写回文件。

您的 JSON 库将具有将 JSON 转换为字符串的功能,就像将字符串转换为 JSON 一样。

附言我建议你遵守 JavaScript 约定并使用驼峰命名为你的变量名,除非你的工作地点有其他习俗。 http://javascript.crockford.com/code.html

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多