编辑解析的JSON

时间:2009-10-11 14:48:31

标签: ajax json forms editing

我有一个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);

2 个答案:

答案 0 :(得分: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它(不安全)或使用this oneJSON.parse之类的JSON解析器。获得转换后的JSON对象后,您可以在标准JS中执行所需的任何修改。然后,您可以使用相同的库将JS对象转换为JSON字符串(JSON.stringify)。 Javascript不允许文件访问(除非您正在执行serverside JS),因此这会阻止您阅读&直接写入contact.txt文件。您必须使用服务器端语言(如Python,Java等)来读取和写入文件。

答案 1 :(得分:0)

一旦你读了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一样。

P.S。我建议您遵守JavaScript惯例并使用camelcase作为变量名称,除非您在工作地点有其他习惯。 http://javascript.crockford.com/code.html