Как получить доступ к значению из вложенного словаря в Swift4? - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу получить значение Город: в моей структуре JSON.Я получаю данные внутри словаря со словарем : [String: Any]?

Я уже пробовал несколько методов, но у меня ничего не получалось.Я думаю, что моя проблема в том, что вложенная структура с кратным {и [

{
"Format": "XXXXXXXXX",
"FormatVersion": "1.0",
"Status": "OK",
"NumToReturn": 1,
"AllResults": [
{
  "ConversationState": {
    "ConversationStateTime": XXXXXXXXX,
    "QueryEntities": {
      "Where": [
        {
          "Type": "City",
          "Label": "Stuttgart, Germany",
          "SpokenLabel": "Stuttgart",
          "Address": "Stuttgart, Baden-Wurttemberg, Germany",
          "City": "Stuttgart",
          "Admin2": "Regierungsbezirk Stuttgart",
          "Admin1": "Baden-Wurttemberg",
          "Country": "Germany",
          "CountryCode": "DE",
          "IATA": "STR",
          "Geohash": "u0wt8bd9854n",
          "Verified": true,
          "HighConfidence": true,
          "CurrentLocation": false,
          "Latitude": 48.78231811523438,
          "Longitude": 9.177020072937012,
          "ReferenceDatum": "WGS84",
          "TimeZone": "Europe/Berlin",
          "Radius": 10,
          "Links": [
            {
              "Label": "Wikipedia",
              "URL": "http://en.wikipedia.org/wiki/Stuttgart"
            }
          ],
          "TypeID": 5,
          "SourceID": 2,
          "RecordID": 2825297
        }
      ]
    }
   }
  }
 ]
}

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Если ваш JSON не является примером и вы его используете, в ConversationStateTime указано недопустимое значение JSON.Его значение должно быть внутри двойной кавычки, если оно не является целочисленным значением.

"ConversationStateTime": "XXXXXXXXX"

Надеюсь, эта помощь!

0 голосов
/ 24 декабря 2018
  1. Пожалуйста, проверьте ваш JSON.«ConversationStateTime» не имеет правильного значения
  2. Если оно допустимо, попробуйте этот код, чтобы получить значение «City» из вашего JSON

    // response is your JSON
    
     func parseJSON() {
        let allResults = response!["AllResults"] as? NSArray
    
        for (_, element) in (allResults?.enumerated())! {
            let elementDict = element as? Dictionary<String, AnyObject>
            let conversationStateDict = elementDict!["ConversationState"] as? Dictionary<String, AnyObject>
            let queryDict = conversationStateDict!["QueryEntities"] as? Dictionary<String, AnyObject>
            let whereDict = queryDict!["Where"] as? NSArray
    
            for (_, whereDictElement) in (whereDict?.enumerated())! {
                let dict = whereDictElement as? Dictionary<String, AnyObject>
                print(dict!["City"])
            }
        }
    }
    
0 голосов
/ 24 декабря 2018
import Foundation

struct YourClass: Codable {
    let format, formatVersion, status: String
    let numToReturn: Int
    let allResults: [AllResult]

    enum CodingKeys: String, CodingKey {
        case format = "Format"
        case formatVersion = "FormatVersion"
        case status = "Status"
        case numToReturn = "NumToReturn"
        case allResults = "AllResults"
    }
}

struct AllResult: Codable {
    let conversationState: ConversationState

    enum CodingKeys: String, CodingKey {
        case conversationState = "ConversationState"
    }
}

struct ConversationState: Codable {
    let conversationStateTime: String
    let queryEntities: QueryEntities

    enum CodingKeys: String, CodingKey {
        case conversationStateTime = "ConversationStateTime"
        case queryEntities = "QueryEntities"
    }
}

struct QueryEntities: Codable {
    let queryEntitiesWhere: [Where]

    enum CodingKeys: String, CodingKey {
        case queryEntitiesWhere = "Where"
    }
}

struct Where: Codable {
    let type, label, spokenLabel, address: String
    let city, admin2, admin1, country: String
    let countryCode, iata, geohash: String
    let verified, highConfidence, currentLocation: Bool
    let latitude, longitude: Double
    let referenceDatum, timeZone: String
    let radius: Int
    let links: [Link]
    let typeID, sourceID, recordID: Int

    enum CodingKeys: String, CodingKey {
        case type = "Type"
        case label = "Label"
        case spokenLabel = "SpokenLabel"
        case address = "Address"
        case city = "City"
        case admin2 = "Admin2"
        case admin1 = "Admin1"
        case country = "Country"
        case countryCode = "CountryCode"
        case iata = "IATA"
        case geohash = "Geohash"
        case verified = "Verified"
        case highConfidence = "HighConfidence"
        case currentLocation = "CurrentLocation"
        case latitude = "Latitude"
        case longitude = "Longitude"
        case referenceDatum = "ReferenceDatum"
        case timeZone = "TimeZone"
        case radius = "Radius"
        case links = "Links"
        case typeID = "TypeID"
        case sourceID = "SourceID"
        case recordID = "RecordID"
    }
}

struct Link: Codable {
    let label: String
    let url: String

    enum CodingKeys: String, CodingKey {
        case label = "Label"
        case url = "URL"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...