2017-02-17 3 views
0

Есть 3 строковые переменныеЗаказанный словарь в формате JSON

public var userLoginId : String? 
public var searchString : String? 
public var tableName : String? 

У меня есть словарь:

let dict = ["userLoginId" : userLoginId, "searchString" : searchString,"tableName" : tableName] 

Теперь я сериализовать его JSON:

let data = try! JSONSerialization.data(withJSONObject: dict, options :[]) 
let jsonstring = String(data:data, encoding:.utf8)! 

В jsonstring, каждый раз Я получаю неупорядоченный JSON, как показано ниже:

"{\"tableName\":\"null\",\"userLoginId\":\"Dilip\",\"searchString\":\"Tata\"}" 

Как я могу получить тот же формат, в котором я присвоил значение словарю?

+4

'Словарь' не имеет никакого заказа. –

+1

Я знаю, что словарь не имеет никакого заказа, но сначала подумайте, мне нужен JSON в том же порядке, в который я помещал данные в словарь.Во-вторых, для генерации JSON словарь лучше всего подходит, но я новичок в IOS, поэтому я столкнулся с проблемами –

+0

@Nirav D, упорядочение полезно, когда данные JSON сериализуются и десериализуются в словаре. Поскольку словарь не имеет порядка, тогда вы можете написать много разных строк JSON, даже если они поступают из одного и того же диктата. Есть ли способ десериализовать JSON без использования Dict? – Efren

ответ

0

Словари «неупорядоченные коллекции». Они не имеют никакого порядка для своих пар ключ/значение. Период.

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

Вы также можете создать свой собственный тип коллекции, который использует строки как индексы и сохраняет элементы в отсортированном порядке. Свифт делает это прямо, хотя это будет дорого стоить.

+0

, как вы сказали «Вы также можете написать код, который загружает ключи словаря в изменяемый массив, сортирует массив, а затем использует отсортированный массив ключей для извлечения ключа/пары значений ", купите Zalak, здесь массив ключей будет отсортирован в терминах по алфавиту, но я обеспокоен тем, что индекс словаря не по алфавиту восходящий, нисходящий –

2

Не только у Swift's Dictionary нет заказа, но и словари JSON не соответствуют стандарту. Лучшее, что вы могли бы сделать, это сохранить ключи в правильном порядке в массиве. Вместо итерации словаря вы вместо этого перебираете упорядоченный массив ключей, а затем извлекаете из словаря эти ключи.

Чтобы избежать повторений ключей вручную, вы можете выразить свой словарь как массив (Key, Value) кортежей, например, так:

let keyValuePairs = [ 
    ("userLoginId", userLoginId), 
    ("searchString", searchString), 
    ("tableName", tableName) 
] 

Затем вы можете использовать это изящную Dictionary расширения, чтобы создать новый Dictionary из тех (Key, Value) кортежи:

extension Dictionary { 
    init(_ keyValuePairs: [(Key, Value)]) { 
     self.init(minimumCapacity: keyValuePairs.count) 

     for (key, value) in keyValuePairs { 
      self[key] = value 
     } 
    } 
} 

let dict = Dictionary(keyValuePairs) 
let orderedKeys = keyValuePairs.map{ $0.0 } 

Теперь вы можете использовать orderedKeys в вашем Swift код, или сохранить их в формате JSON вместе с dict:

print("Example usage:") 
for key in orderedKeys { 
    let value = dict[key]! 

    print("\(key): \(value)") 
} 
0

Я знаю, что это было задано год назад. Но я недавно столкнулся с этой проблемой при написании модульных тестов. В основном я написал макет JSON-словарь, который использовал JSONSerialization, чтобы превратить это в данные, и передал его в сортирующий объект. Однако в этом конкретном тесте порядок должен поддерживаться или тест не удался, и ранее описанный метод этого не делал. Итак, что сработало для меня, вместо того, чтобы начинать со словаря, я начинаю с тестовой строки JSON и кодирую ее в данные с помощью utf8. Когда он анализируется в словаре, порядок строки JSON поддерживается в анализируемом словаре.

Смежные вопросы