массив фильтров JSON в Swift - PullRequest
0 голосов
/ 27 февраля 2019

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

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

Учитывая, что это ваш 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"

    }]
"""

Просто создайте Decodable struct вот так

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 здесь .

0 голосов
/ 27 февраля 2019

try Decodable of swift

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
0 голосов
/ 27 февраля 2019

Вы можете попробовать

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"

}]

Более подходящим является сделать

статусом bool нестрока

правильная и глава должна быть целым числом

так что 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

0 голосов
/ 27 февраля 2019

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

filteredArray = myArray.map { ["status": $0.status, "correct": $0.correct, "chapter": $0.chapter]  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...