Как я могу отфильтровать массив json в swift, имея только определенные пары значений ключа?
мой массив выглядит так:
[{
"status" : "true",
"score" : "3",
"correct" : "3",
"chapter" : "34",
"answer" : "342432",
"solutionText" : "abcd",
}, {
"status" : "true",
"score" : "0",
"correct" : "2",
"chapter" : "35",
"answer" : "35854",
"solutionText" : "abc",
}]
я хочу получить массив вывода json, содержащий только пары ключ-значение status, chapter и correct.
Нравится:
[{
"status" : "true",
"correct" : "3",
"chapter" : "34",
}, {
"status" : "true",
"correct" : "2",
"chapter" : "35",
}]
Используйте Decodable и объявите структуру только с необходимыми ключами/членами. Очень легко.
Эй, если вам нужно что-то, что позволит вам создать структуру или класс для JSON. Пожалуйста, попробуйте это app.quicktype.io
@TheiOSDev достойный инструмент, но я думаю, что ему нужно сначала понять протоколы кодирования, чтобы он мог справиться с этим самостоятельно в будущем, а затем он может перейти к инструментам, которые помогут ему сделать это быстрее, любая другая ссылка, связанная с кодируемыми, я думаю, будет помогите ему лучше.





Если он уже находится в объекте, вы можете попробовать
filteredArray = myArray.map { ["status": $0.status, "correct": $0.correct, "chapter": $0.chapter] }
попробуй Decodable свифт
class MyObjectsClass : Decodable {
var objects : [Objects]?
}
class Objects : Decodable {
var status : String?
var correct : String?
var chapter : String?
}
Во время декодирования
let decodedValue = try? JSONDecoder.decode(MyObjectsClass.self, from : data)
// where data from API calls
Это не сработает, и почему класс и почему все свойства необязательны?
Потому что корневой объект JSON не является словарем.
Это не словарь, и я не объявлял словарь.
Вы объявили представление словаря с несуществующим ключом objects.
Можешь попробовать
do {
let res = try JSONDecoder().decode([Root].self, from:data)
}
catch {
print(error)
}
struct Root: Codable {
let status, correct, chapter: String
}
Правильный json
[{
"status" : "true",
"score" : "3",
"correct" : "3",
"chapter" : "34",
"answer" : "342432",
"solutionText" : "abcd"
}, {
"status" : "true",
"score" : "0",
"correct" : "2",
"chapter" : "35",
"answer" : "35854",
"solutionText" : "abc"
}]
Более целесообразно сделать
status a bool not string
correct & chapter to be integers
так json выглядит
[{
"status" : true,
"score" : "3",
"correct" : 3,
"chapter" : 34,
"answer" : "342432",
"solutionText" : "abcd"
}, {
"status" : true,
"score" : "0",
"correct" : 2,
"chapter" : 35,
"answer" : "35854",
"solutionText" : "abc"
}]
вы также можете сделать другие значения, если вам нужно, тогда ваша модель будет выглядеть как
struct Root: Codable {
let status: Bool
let correct, chapter: Int
}
Редактировать:
let data = try content.rawData() // this inside do block
где content имеет тип JSON
какова цель do catch?
это полезно, когда у вас есть ошибки декодирования, такие как, например, добавление необязательного ключа, который не существует в json или существует, но с другим типом, или опечатка в правильном имени ключа, это поможет отследить проблему, чтобы исправить ее
правда, конечно, но я имею в виду, что в данном случае это не так критично, довольно просто прямолинейно .. ? было бы просто отлично, наверное, я думаю
это лучшая практика для консультирования новичков, даже если они на 100% уверены, что не будет никаких ошибок
@Sh_Khan получает эту ошибку. Не удается преобразовать значение типа «[JSON]» в ожидаемый тип аргумента «Данные».
также хороший момент, но иногда слишком много информации может заставить их поверить, что сообщество всегда решит их проблемы и научит их ... idk для моего pov id, а не для того, чтобы дать им ссылку на тему, чтобы узнать больше о том, что происходит, они, вероятно, лучше понимать и снижает вероятность таких вопросов в будущем, например, вы не объяснили в ответе на операцию, почему вы обрабатываете ошибки, он может просто скопировать его и использовать так для остальной части его жизнь хд
@AMANSHARMA Сначала вам нужно преобразовать его в данные, посмотрите другие ответы, которые вы получили 4
@AMANSHARMA кажется, вы используете swiftyJson, так что посмотрите на мой отредактированный ответ
Учитывая, что это твой JSON
var myJSON = """
[{
"status" : "true",
"score" : "3",
"correct" : "3",
"chapter" : "34",
"answer" : "342432",
"solutionText" : "abcd"
}, {
"status" : "true",
"score" : "0",
"correct" : "2",
"chapter" : "35",
"answer" : "35854",
"solutionText" : "abc"
}]
"""
Просто создайте Decodablestruct вот так
typealias MyArray = [MyObject] // Use this to decode
struct MyObject: Codable {
let status, correct, chapter: String
}
И использовать это так
//Usage
var myJSONData = myJSON.data(using: .utf8)! // converting the JSON to data
let objArray = try! JSONDecoder().decode(MyArray.self, from: myJSONData) // decoding the json data into an object
//how to access
print(objArray.count)// number of elements in my array
print(objArray.first!) // getting the first object
let myObject = obj[0] // also getting the first object by index
myObject.chapter
myObject.correct
myObject.status
Читайте о Codableздесь .
Разве ваш ответ не похож на то, что уже было добавлено? , плюс вы не проясняете обсуждаемую вами ошибку
@Sh_Khan Прочитайте о Codable здесь, раздел, я думаю, он может получить все возможные объяснения для каждого шага, + уже ответил на вопрос о SO, и я не копировал ваш ответ, если вы это имеете в виду, я не могу сказать, кто его опубликовал во-первых, но если хочешь, я могу удалить его, если он доставляет тебе какие-либо проблемы.
@Sh_Khan, и если бы это был редкий случай, мы бы наверняка все, как сообщество, работали над этим и пытались получить объяснения и т. д., Но это прямой случай, который был опубликован слишком много раз, хм, даже почему этот вопрос все еще не закрыто, как-то странно, нет модов онлайн или что-то в этом роде
@MohmmadS мой вывод выглядит так: [quizApp.SessionReport.MyObject(status: "true", correct: "1", chapter: "35")] как получить только массив JSON?
это тот массив, но он выводит такие объекты ^_^ попробуйте эти команды, вы поймете идею print(obj.count)// 2 print(obj.first!)
каждый объект содержит необходимые вам элементы, поэтому первый индекс позволяет сказать, что 0 содержит объект, к которому вы можете просто получить доступ к свойствам объекта let myObject = obj[0] // getting the first object myObject.chapter myObject.correct myObject.status
Можете ли вы показать нам, что вы уже сделали?