Фильтровать массив JSON в Swift

Как я могу отфильтровать массив 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",
}]

Можете ли вы показать нам, что вы уже сделали?

carsten 27.02.2019 10:50

Используйте Decodable и объявите структуру только с необходимыми ключами/членами. Очень легко.

vadian 27.02.2019 10:51

Эй, если вам нужно что-то, что позволит вам создать структуру или класс для JSON. Пожалуйста, попробуйте это app.quicktype.io

The iOSDev 27.02.2019 10:56

@TheiOSDev достойный инструмент, но я думаю, что ему нужно сначала понять протоколы кодирования, чтобы он мог справиться с этим самостоятельно в будущем, а затем он может перейти к инструментам, которые помогут ему сделать это быстрее, любая другая ссылка, связанная с кодируемыми, я думаю, будет помогите ему лучше.

Mohmmad S 27.02.2019 11:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
4
1 157
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если он уже находится в объекте, вы можете попробовать

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

Это не сработает, и почему класс и почему все свойства необязательны?

vadian 27.02.2019 10:56

Потому что корневой объект JSON не является словарем.

vadian 27.02.2019 10:59

Это не словарь, и я не объявлял словарь.

Ankur Lahiry 27.02.2019 11:06

Вы объявили представление словаря с несуществующим ключом objects.

vadian 27.02.2019 11:08

Можешь попробовать

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?

Mohmmad S 27.02.2019 11:07

это полезно, когда у вас есть ошибки декодирования, такие как, например, добавление необязательного ключа, который не существует в json или существует, но с другим типом, или опечатка в правильном имени ключа, это поможет отследить проблему, чтобы исправить ее

Sh_Khan 27.02.2019 11:09

правда, конечно, но я имею в виду, что в данном случае это не так критично, довольно просто прямолинейно .. ? было бы просто отлично, наверное, я думаю

Mohmmad S 27.02.2019 11:12

это лучшая практика для консультирования новичков, даже если они на 100% уверены, что не будет никаких ошибок

Sh_Khan 27.02.2019 11:14

@Sh_Khan получает эту ошибку. Не удается преобразовать значение типа «[JSON]» в ожидаемый тип аргумента «Данные».

AMAN SHARMA 27.02.2019 11:17

также хороший момент, но иногда слишком много информации может заставить их поверить, что сообщество всегда решит их проблемы и научит их ... idk для моего pov id, а не для того, чтобы дать им ссылку на тему, чтобы узнать больше о том, что происходит, они, вероятно, лучше понимать и снижает вероятность таких вопросов в будущем, например, вы не объяснили в ответе на операцию, почему вы обрабатываете ошибки, он может просто скопировать его и использовать так для остальной части его жизнь хд

Mohmmad S 27.02.2019 11:17

@AMANSHARMA Сначала вам нужно преобразовать его в данные, посмотрите другие ответы, которые вы получили 4

Mohmmad S 27.02.2019 11:18

@AMANSHARMA кажется, вы используете swiftyJson, так что посмотрите на мой отредактированный ответ

Sh_Khan 27.02.2019 11:23
Ответ принят как подходящий

Учитывая, что это твой 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 27.02.2019 11:26

@Sh_Khan Прочитайте о Codable здесь, раздел, я думаю, он может получить все возможные объяснения для каждого шага, + уже ответил на вопрос о SO, и я не копировал ваш ответ, если вы это имеете в виду, я не могу сказать, кто его опубликовал во-первых, но если хочешь, я могу удалить его, если он доставляет тебе какие-либо проблемы.

Mohmmad S 27.02.2019 11:29

@Sh_Khan, и если бы это был редкий случай, мы бы наверняка все, как сообщество, работали над этим и пытались получить объяснения и т. д., Но это прямой случай, который был опубликован слишком много раз, хм, даже почему этот вопрос все еще не закрыто, как-то странно, нет модов онлайн или что-то в этом роде

Mohmmad S 27.02.2019 11:32

@MohmmadS мой вывод выглядит так: [quizApp.SessionReport.MyObject(status: "true", correct: "1", chapter: "35")] как получить только массив JSON?

AMAN SHARMA 27.02.2019 11:48

это тот массив, но он выводит такие объекты ^_^ попробуйте эти команды, вы поймете идею print(obj.count)// 2 print(obj.first!)

Mohmmad S 27.02.2019 11:50

каждый объект содержит необходимые вам элементы, поэтому первый индекс позволяет сказать, что 0 содержит объект, к которому вы можете просто получить доступ к свойствам объекта let myObject = obj[0] // getting the first object myObject.chapter myObject.correct myObject.status

Mohmmad S 27.02.2019 11:52

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