Редактировать разобранный JSON - PullRequest
2 голосов
/ 11 октября 2009

У меня есть файл 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 ]

1 голос
/ 11 октября 2009

Это зависит от того, какую технологию вы используете. Основной процесс заключается в чтении файла в нем, преобразовании его в любые собственные типы данных (хэш, dict, list и т. Д.) С использованием библиотеки синтаксического анализа 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)

Данные в этом примере представляют собой жестко закодированные строки, но они могут быть получены из другого файла или из данных запроса / формы веб-приложения и т. Д. Если вы делаете это в веб-приложении, я бы не советовал читать и писать в один и тот же файл (в случае одновременного поступления двух запросов).

Пожалуйста, предоставьте больше информации, если это не ответит на ваш вопрос.


В ответ на вопрос «разве нет способа сделать это с использованием стандартного JavaScript?»:

Чтобы проанализировать строку JSON в Javascript, вы можете либо eval это (небезопасно), либо использовать синтаксический анализатор JSON, такой как этот JSON.parse. Когда у вас есть преобразованный объект JSON, вы можете выполнять любые модификации, которые вам нужны, в стандартном JS. Затем вы можете использовать эту же библиотеку для преобразования объекта JS в строку JSON (JSON.stringify). Javascript не разрешает доступ к файлу (если вы не используете серверная часть JS ), поэтому вы не сможете читать и записывать файл contact.txt напрямую. Для чтения и записи файла вам придется использовать серверный язык (например, Python, Java и т. Д.).

0 голосов
/ 11 октября 2009

После того, как вы прочитали в 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

...