Преобразовать строку?

У меня получилась такая строка:

let arrayString : String = "[[1, 123, 0], [4, 003, 21]]"

и я хотел бы преобразовать эту строку в 2d-массив этого типа: [[String]].


Я пробовал использовать что-то вроде этих строк:

var array : [[String]]  = arrayString as! [[String]]; // abort error

а также примерно так:

if let json = try? JSONSerialization.jsonObject(with: ucode.data(using: .utf8)!, options: []) {
        let array = json as! [[String]];
        print(array[0][0]) // prints nothing --> just ""
    }

So I got no idea how I could solve this problem to convert:

"[[1, 123, 0], [4, 003, 21]]" ----> [["1", "123", "0"], ["4", "003", "21"]]

Любая помощь будет очень признательна, заранее миллион.

Возможно, это не связано, но в какой-то момент я думаю, что преобразование его в массив 2D ints приведет к тому, что «003» станет «3», вас это устраивает?

Ahmad F 15.04.2018 11:14

Привет, спасибо за комментарий - Нет, это одна из больших проблем: строка в формате int с недопустимым синтаксисом, например 003 вместо 3, но мне нужно вернуть строку типа «003», так что НЕТ. «3» в этом случае не годится! :)

user9591123 15.04.2018 11:17
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я попробовал протестировать ваш код и обнаружил эту ошибку:

let arrayString: String = "[[1, 123, 0], [4, 003, 21]]"

Error Domain=NSCocoaErrorDomain Code=3840 "Number with leading zero around character 19. (003)

Это означает, ваш arrayString имеет неправильный формат json.

JSON string cannot have number with leading zero character.

Я удалил начальный нулевой символ из вашего arrayString, и он работал правильно.

    let arrayString : String = "[[1, 123, 0], [4, 3, 21]]"
    do {
        let json = try JSONSerialization.jsonObject(with: arrayString.data(using: .utf8)!, options: [])
        print(json)
    } catch (let error) {
        print(error.localizedDescription)
    }

Спасибо за быстрый ответ, но это БОЛЬШАЯ проблема: мне нужны начальные нули «003» вместо «3».

user9591123 15.04.2018 11:05

Это не то решение, которое я хотел бы получить. -1

user9591123 15.04.2018 16:39
Ответ принят как подходящий

В основном это строка JSON, но сериализатор жалуется на ведущие нули.

Решение состоит в том, чтобы преобразовать целочисленные значения в String, добавив двойные кавычки перед для десериализации JSON. Этого можно просто добиться с помощью регулярного выражения

let arrayString = "[[1, 123, 0], [4, 003, 21]]"
let convertedArrayString = arrayString.replacingOccurrences(of: "\\d+", with: "\"$0\"", options: .regularExpression)
let data = Data(convertedArrayString.utf8)
do {
    if let array = try JSONSerialization.jsonObject(with: data) as? [[String]] {
        print(array)
    }
} catch { print(error)}

Спасибо за ваше решение.

user9591123 15.04.2018 16:40

Другие вопросы по теме