Как преобразовать строку в словарь JSON.? - PullRequest
0 голосов
/ 04 ноября 2019

Ниже приведен фрагмент кода, который я использую для преобразования string в dictionary, но не работает.

let body = "{status:0}"
do {
    let dictionary = try convertToDictionary(from: body ?? "")
    print(dictionary) // prints: ["City": "Paris"]
} catch {
    print(error)
}

func convertToDictionary(from text: String) throws -> [String: String] {
    guard let data = text.data(using: .utf8) else { return [:] }

    let anyResult: Any = try JSONSerialization.jsonObject(with: data, options: [])

    return anyResult as? [String: String] ?? [:]
}

Ответы [ 4 ]

0 голосов
/ 04 ноября 2019

Поскольку входная строка не является json, я предлагаю решение, отличное от json

let array = body.dropFirst().dropLast().split(separator: ":").map {String($0)} 

var dictionary = [String: String]()
if let key = array.first, let value = array.last { 
    dictionary[key] = value
}
0 голосов
/ 04 ноября 2019

Я рекомендую вам использовать Codable протокол. Вместо использования словарей используйте какой-то определенный класс / структуру для анализа данных. Вы можете использовать код, подобный следующему:

struct Status: Codable {
    let status: Int
}

let body = "{\"status\":0}".data(using: .utf8)!
do {
    let decoder = JSONDecoder()
    let status = try decoder.decode(Status.self, from: body)
    print(status) //Status(status: 0)
} catch {
    print("\(error)")
}

Это более безопасный способ обработки ответа JSON. Кроме того, он дал вам информацию о том, что идет не так, чтобы вы могли легко это исправить. Например, если вы используете let status: String, вы получите эту ошибку:

typeMismatch(Swift.String, 
Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "status", intValue: nil)], 
debugDescription: "Expected to decode String but found a number instead.", 
underlyingError: nil))

Подробнее о Codable вы можете прочитать в Кодировка и декодирование пользовательских типов статья написанаApple, или поищите Codable учебник онлайн - там много хороших статей.

0 голосов
/ 04 ноября 2019
let body = "{\"status\":\"0\"}" 

do {
     let dictionary = try convertToDictionary(from: body )
      print(dictionary) 
   } catch {
        print(error)
  }

func convertToDictionary(from text: String) throws -> [String: Any] {
    if let data = text.data(using: .utf8) {
        do {
            return try (JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] ?? [:])
        } catch {
            print(error.localizedDescription)
        }
    }

    return [:]
}

Out Put -> ["status": 0]

0 голосов
/ 04 ноября 2019

Две проблемы:

  1. Значение Int, поэтому приведение типа к [String:String] завершается неудачей.
  2. Для формата JSON требуются ключи, заключенные в двойные кавычки.

Работает с any типом значения

let body = """
{"status":0}
"""

do {
    let dictionary = try convertToDictionary(from: body)
    print(dictionary) // prints: ["City": "Paris"]
} catch {
    print(error)
}

func convertToDictionary(from text: String) throws -> [String: Any] {
    let data = Data(text.utf8)
    return try JSONSerialization.jsonObject(with: data) as? [String:Any] ?? [:]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...