2016-04-16 3 views
0

Я сериализую файл json, чьи пары ключ-значение не следует перетасовывать при записи в новый файл после редактирования. Даже если я не редактирую, он по-прежнему перемещает пары.Как читать-писать json-файл, не нарушая последовательности его пар ключ-значение в iOS?

Мне просто нужна такая же последовательность пар ключ-значение в новом файле (записанный файл), как и в предыдущем файле, который я читал.

Вот пример JSON

[ 
{ 
    "StudentName":"Amit", 
    "StudentId":"1" 
}, 
{ 
"StudentName":"Lalit", 
"StudentId":"2" 
}, 
{ 
"StudentName":"Ram", 
"StudentId":"3" 
}, 
{ 
"StudentName":"Shyam", 
"StudentId":"4" 
} 
] 

Что я получаю после написания JSONObject в новый файл является:

[ 
    { 
    "StudentName":"Lalit", 
    "StudentId":"2" 
    }, 
    { 
    "StudentName":"Ram", 
    "StudentId":"3" 
    }, 
{ 
    "StudentName":"Shyam", 
    "StudentId":"4" 
}, 
{ 
    "StudentName":"Amit", 
    "StudentId":"1" 
} 
] 

У меня есть два файла кода, так как я работаю в командной строке инструмент.

1) main.swift

import Foundation 

    var behavioralJsonObject : AnyObject 
    var newBehavioralDataObject: NSData = NSData() 

    let fileManager = NSFileManager.defaultManager() 
    var path = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first 
    var stringPath: String = (path?.path)! 

    var behavioralFilePath: String = stringPath.stringByAppendingString("/BehavioralFile.json") 
    var newBehavioralFilePath : String = stringPath.stringByAppendingString("/BehavioralFileNew.json") 


    behavioralJsonObject = MyJsonParser().jsonObject(withFilePath: behavioralFilePath) 

    print(behavioralJsonObject.description) 

    newBehavioralDataObject = try NSJSONSerialization.dataWithJSONObject(behavioralJsonObject, options: .PrettyPrinted) 


    newBehavioralDataObject.writeToFile(newBehavioralFilePath, atomically: true) 

2) MyJsonParser.swift

import Foundation 

    class MyJsonParser: NSObject { 

    func jsonObject(withFilePath path:String)-> AnyObject{ 
    let dataObject = NSData.init(contentsOfFile: path) 
    var jsonObject: AnyObject = [] 
    do{ 
    jsonObject = try NSJSONSerialization.JSONObjectWithData(dataObject!, options: .AllowFragments) 
    } 
    catch{ 
     print("Serialization error : \(error)") 
    } 
    return jsonObject; 
    } 

} 

ли кто-нибудь уже сталкивался с этой проблемой или имеет решение для этого?

+0

Обновите свой вопрос соответствующим кодом. – rmaddy

+0

Я добавил код. –

+0

Что делает «print (jsonObject.dynamicType» в методе «jsonObject (withFilePath path: String)»? Просто убедитесь, что вы читаете в массиве, а не в словаре. – TofuBeer

ответ

0

Повторите проверку кода. Если ваш код верен, вы разбираете массив JSON, преобразуете его обратно в данные и не записываете элементы массива в правильном порядке. Если это то, что на самом деле происходит, то единственное, что вы можете сделать, это отправить отчет об ошибке Apple и позволить им исправить это. Элементы массива имеют определенный порядок; если это изменено актом чтения и записи массива, тогда есть где-то серьезная ошибка.

Это разные словари. Пара ключей/значений в словаре неупорядочен. Вы не можете узнать, в каком порядке они были разобраны, и порядок, в котором они написаны, не определен. Поэтому, если ваш первый элемент массива был записан как

{ 
    "StudentId":"1" 
    "StudentName":"Amit", 
}, 

, что было бы вполне ожидаемо и полностью исправить. Однако изменение порядка элементов массива является ошибкой. Обратите внимание: если вы действительно прочитали словарь и распечатали массив значений словаря, это снова будет в неопределенном порядке.

+0

Не могу я получить словари, не перетасованные? В любом случае? –

+1

Если вы зависите от порядка ключей внутри объекта, вы не используете JSON правильно, так как он не гарантирует никакого заказа (это определенно неупорядоченная коллекция в спецификации). – TofuBeer

+0

На самом деле у меня есть json, который содержит более чем 3000 записей (вложенных), с надлежащим стандартом, и этот стандарт необходимо поддерживать. –