JSON как необработанная строка, заключенная в квадратные скобки? - PullRequest
0 голосов
/ 10 июля 2019

ПРИМЕЧАНИЕ: ЭТОТ ВОПРОС ВСЕГО БЕЗУПРАВЛЕН сейчас, поскольку выясняется, что то, чего я хотел достичь, фактически было возможно при использовании моего оригинального метода.Это было на самом деле только я, отправив пустой набор параметров, который вызвал проблемы.Тем не менее, возможно, кто-то где-то найдет один из предложенных методов полезным, поэтому я оставлю его здесь.

Я использовал следующий фрагмент кода, чтобы преобразовать JSON в необработанную строку идеально для JSONэто заключено в фигурные скобки:

AF.request("https://blahblah.com", method: .get, parameters: [:], encoding:JSONEncoding.default, headers: headers)
            .responseJSON { response in
                guard let data = response.data else { return }
                let json = try? JSON(data:data)
                if let jsonAsString = json?.rawString(){
                    self.consoleWindow.stringValue += jsonAsString
                }
           }

Это хорошо работает, когда JSON заключен в фигурные скобки, например:

{
        "blah1": true,
        "blah2": "ABCDEF",
        "blah3": "12345"
}

Однако, JSON, который я сейчас получаю, заключенв квадратных скобках, например: (РЕДАКТИРОВАТЬ: не обязательно всегда 3 элемента, необходимо общее решение)

[
    {
        "blah1": true,
        "blah2": "ABCDEF",
        "blah3": "12345"
    }
]

Когда я использую свой оригинальный метод, я просто получаю пустую строку.

Я новичок в JSON и SwiftyJSON, поэтому я не уверен, как квадратные скобки изменяют структуру JSON.Как вывести JSON в квадратных скобках в виде необработанной строки, как я делал с JSON в фигурных скобках?

РЕДАКТИРОВАТЬ: В некотором контексте я пытаюсь создать что-то вроде консольного окна, которое будет выводить JSONлюбого формата, с любым количеством элементов.

1 Ответ

0 голосов
/ 10 июля 2019

Если вы просто хотите получить строковое представление ответа вашего сервера, сделайте следующее:

AF.request("https://blahblah.com", method: .get, parameters: [:], encoding:JSONEncoding.default, headers: headers)
    .responseJSON { response in
        guard 
            let data = response.data,
            let string = String(bytes: data, encoding: .utf8) 
        else { 
            return 
        }

        self.consoleWindow.stringValue += string
    }
}

Если вам нужно проанализировать полученные данные в объектах модели, я бы рекомендовал использовать встроенный SwiftCodable вместо SwiftyJSON для этого.

let json = """
[
  {
    "blah1": true,
    "blah2": "ABCDEF",
    "blah3": "12345"
  }
]
""".data(using: .utf8)!

struct Bla: Codable {
    let blah1: Bool
    let blah2: String
    let blah3: String
}

do {
    // use [Bla].self to decode an array, or Bla.self for a single instance
    let bla = try JSONDecoder().decode([Bla].self, from: json)
    print(bla)
} catch {
    print(error)
}

Наконец, я бы также порекомендовал подумать о том, зачем вам нужен Alamofire.Использование URLSession / URLSessionDataTask на самом деле не так сложно, и наличие меньшего количества сторонних зависимостей почти всегда является плюсом, ИМХО.

...