#json #swift #swifty-json
#json #swift #swifty-json
Вопрос:
как я могу извлечь все значения с ключом «text» в приведенный ниже json-файл с помощью SwiftyJSON? это ответ от Microsoft cognitive services text recognition.
{
"language": "de",
"textAngle": 0,
"orientation": "Up",
"regions": [
{
"boundingBox": "353,597,1926,1277",
"lines": [
{
"boundingBox": "1091,597,410,93",
"words": [
{
"boundingBox": "1091,604,106,84",
"text": "Ka"
},
{
"boundingBox": "1210,597,291,93",
"text": "uflond"
}
]
},
{
"boundingBox": "1122,861,358,89",
"words": [
{
"boundingBox": "1122,866,174,84",
"text": "Kauf"
},
{
"boundingBox": "1314,865,21,85",
"text": "I"
},
{
"boundingBox": "1348,861,132,87",
"text": "and"
}
]
},
{
"boundingBox": "948,982,649,81",
"words": [
{
"boundingBox": "948,986,398,77",
"text": "Schwabenp"
},
{
"boundingBox": "1359,984,19,74",
"text": "I"
},
{
"boundingBox": "1393,986,131,69",
"text": "atz"
},
{
"boundingBox": "1546,982,51,74",
"text": "LI"
}
]
},
{
"boundingBox": "944,1088,665,80",
"words": [
{
"boundingBox": "944,1089,220,79",
"text": "70563"
},
{
"boundingBox": "1210,1088,399,75",
"text": "Stutt
файл json намного больше, и в нем много значений с ключом «text» разной глубины, и я не знаю, как мне выполнить цикл через все тело Json!
спасибо за вашу помощь
Комментарии:
1. Если вы используете Swift 4, мы бы рекомендовали вам использовать Codable. Если нет, вы должны понимать структуру JSON. Это не так сложно, это просто словарь верхнего уровня, в котором есть ключевые регионы, значением которых является массив словарей и т.д. При необходимости выполняйте это шаг за шагом. Итак, вы что-нибудь пробовали?
Ответ №1:
Приведите все свои объекты в соответствие с Codable
, затем просто копайте по мере необходимости, как только вы создадите экземпляры, например, с помощью TextDto
класса-оболочки:
class TextDto: Codable {
let language: String
let textAngle: Int
let orientation: String
let regions: [Region]
init(language: String, textAngle: Int, orientation: String, regions: [Region]) {
self.language = language
self.textAngle = textAngle
self.orientation = orientation
self.regions = regions
}
}
class Region: Codable {
let boundingBox: String
let lines: [Line]
init(boundingBox: String, lines: [Line]) {
self.boundingBox = boundingBox
self.lines = lines
}
}
class Line: Codable {
let boundingBox: String
let words: [Word]
init(boundingBox: String, words: [Word]) {
self.boundingBox = boundingBox
self.words = words
}
}
class Word: Codable {
let boundingBox, text: String
init(boundingBox: String, text: String) {
self.boundingBox = boundingBox
self.text = text
}
}
Как только вы получите свой TextDto
из api, вы можете выполнить цикл по всем lines
и words
с .forEach {}
замыканиями или for...in
циклами, как вы считаете нужным
Комментарии:
1. Если вы примете,
Codable
вы можете удалить всеinit
методы. ВCodable
любом случае они не используются. И используйте классы, только если вам действительно нужна ссылочная семантика.2. Верно, но я не знал варианта использования этого парня (нет способа вывести это из предоставленной им информации) — он мог бы просто использовать
Struct
s, если это более уместно.