Как добавить значение Json в массив Array для отображения в табличном представлении в Swift - PullRequest
0 голосов
/ 03 марта 2019

Я использую tableview для отображения значения Two Json, но проблема в том, что я не могу добавить значение в структуру модели для отображения в tableview с использованием двух API.я хочу показать процентное значение в одной из меток ячейки, и вот мой json

[
{
    "Percentage": 99.792098999,
}
]

мое второе значение json

{
"Categories": [
    "Developer",
    "ios "
],
"Tags": [
    {
        "Value": "kishore",
        "Key": "Name"
    },
    {
        "Value": "2",
        "Key": "office"
    },

]
}

, и мне нужно показать значение Категории в метке Категории вtableview

значение и ключ для tableview

вот мой Struct

struct info: Decodable {

let Categories: String?
let Tags: String?
let Value: String?
let Key: String?
var Name: String?
let percentage: Double?

} 

вот мой код

var List = [info]()

do {

            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
            print(json as Any)

            guard let jsonArray = json as? [[String: Any]] else {
                return
            }
            print(jsonArray)

            for dic in jsonArray{
                guard let per = dic["percentage"] as? Double else { return }

                print(per)


 }

и второй json

  if let array = json["Tags"] as? [[String: String]] {
                for dict in array {

                    let key = dict["Key"]
                    let value = dict["Value"]
                    switch key {
                    case "office":

                    case "Name":

                    default:
                        break;
                    }
                }

вот моя ячейка для строки indexpath

 cell.Categories.text  = list[indexpath.row].percentage

    cell.Name.text = list[indexpath.row].name
    cell.office.text = list[indexpath.row].office

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Я предпочитаю использовать Codable все время с JSON, даже для более простых типов, поэтому для процента я бы сделал

struct ItemElement: Decodable {
    let percentage: Double

    enum CodingKeys: String, CodingKey {
        case percentage = "Percentage"
    }
}

, и нам нужно хранить эти значения в отдельном массиве, объявленном как класссвойство

let percentageList: [Double]()

и кодировка json будет тогда

let decoder = JSONDecoder()
do {
    let result = try decoder.decode([ItemElement].self, from: data)
    percentageList = result.map { item.percentage } 
} catch {
    print(error)
}

аналогично для второй части

struct Item: Decodable {
    let categories: [String]
    let tags: [Tag]

    enum CodingKeys: String, CodingKey {
        case categories = "Categories"
        case tags = "Tags"
    }
}

struct Tag: Decodable {
    let value, key: String

    enum CodingKeys: String, CodingKey {
        case value = "Value"
        case key = "Key"
    }
}

использовать словарь для результата, снова как класссвойство

var values = [String: String]()

и декодирование

let decoder = JSONDecoder()
do {
    let result = try decoder.decode(Item.self, from: data)
    for item in result.tags {
        values[item.key] = values.item.value
    }
} catch {
    print(error)
}

, а затем в ячейке для кода строки

cell.Categories.text  = percentageList[indexpath.row].percentage

cell.Name.text = values["name"]
cell.office.text = values["office"]

Обратите внимание, что этот последний код выглядит очень странно, так как вы нене имеет массива имен / служебных ценностей, судя по вашему json.Может быть, вы упростили его каким-то образом, но приведенный выше код - лучшее, что я могу сделать с приведенной информацией, даже если она неверна

0 голосов
/ 03 марта 2019

Пожалуйста, используйте Swift 4 Codable протокол для декодирования значения из JSON.

//1.0 Create your structures and make it conform to Codable Protocol
struct Tags: Codable{
    var Key: String
    var Value: String
}

struct Sample: Codable{
    var Categories: [String]
    var Tags: [Tags]
}

В вашем методе выполните следующие шаги:

//2.0 Get your json data from your API. In example below, i am reading from a JSON file named "Sample.json"
if let path = Bundle.main.path(forResource: "Sample", ofType: "json") {
    do {
        let jsonData = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)

        do {
            //3.0 use JSONDecoder's decode method to decode JSON to your model.
            let sample = try JSONDecoder().decode(Sample.self, from: jsonData)

            //4.0 User the "sample" model to do your stuff. Example, printing some values
            print("Sample.Category = \(sample.Categories)")
            print("Sample.Name = \(sample.Tags[0].Value)")
            print("Sample.Office = \(sample.Tags[1].Value)")
        } catch let error {
            print("Error = \(error)")
        }
    } catch {
        // handle error
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...