Ключ JSON: пары значений исчезают после первоначального вызова json - PullRequest
0 голосов
/ 29 мая 2018

Я пытался читать данные из JSON, используя Swift, но он не работал после первоначального вызова json.Вот мой код, который работает:

func loadUrl(url:String){
    DispatchQueue.global().async {
        do {
            let appUrl = URL(string:url)!
            let data = try Data(contentsOf:appUrl)
            let json = try JSONSerialization.jsonObject(with: data) as! [String:Any]
            DispatchQueue.main.async {
                print(json)
            }
        } catch {
            DispatchQueue.main.async {
                print("Cannot connect to the server.")
            }
        }
    }
}

Он печатает этот результат:

["results": <__NSSingleObjectArrayI 0x60000000ae80>(
    {
        "address_components" =     (
                {
            "long_name" = Brooklyn;
            "short_name" = Brooklyn;
            types =             (
                political,
                sublocality,
                "sublocality_level_1"
            );
        },
                {
            "long_name" = "New York";
            "short_name" = "New York";
            types =             (
                locality,
                political
            );
        },
                {
            "long_name" = "Kings County";
            "short_name" = "Kings County";
            types =             (
                "administrative_area_level_2",
                political
            );
        },
                {
            "long_name" = "New York";
            "short_name" = NY;
            types =             (
                "administrative_area_level_1",
                political
            );
        },
                {
            "long_name" = "United States";
            "short_name" = US;
            types =             (
                country,
                political
            );
        }
    );
    "formatted_address" = "Brooklyn, NY, USA";
    geometry =     {
        bounds =         {
            northeast =             {
                lat = "40.739446";
                lng = "-73.83336509999999";
            };
            southwest =             {
                lat = "40.551042";
                lng = "-74.05663";
            };
        };
        location =         {
            lat = "40.6781784";
            lng = "-73.94415789999999";
        };
        "location_type" = APPROXIMATE;
        viewport =         {
            northeast =             {
                lat = "40.739446";
                lng = "-73.83336509999999";
            };
            southwest =             {
                lat = "40.551042";
                lng = "-74.05663";
            };
        };
    };
    "place_id" = ChIJCSF8lBZEwokRhngABHRcdoI;
    types =     (
        political,
        sublocality,
        "sublocality_level_1"
    );
}
)
, "status": OK]

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

func loadUrl(url:String){
    DispatchQueue.global().async {
        do {
            let appUrl = URL(string:url)!
            let data = try Data(contentsOf:appUrl)
            let json = try JSONSerialization.jsonObject(with: data) as! [String:Any]
            let results = json["results"] as! [String:Any]
            DispatchQueue.main.async {
                print(results)
            }
        } catch {
            DispatchQueue.main.async {
                print("Cannot connect to the server.")
            }
        }
    }
}

Кто-нибудь знает, как это исправить?Единственное, что я заметил, это то, что значение результатов таково:

<__NSSingleObjectArrayI 0x604000206d60>

Я понятия не имею, что это такое.Когда я поместил тот же самый json в онлайн-просмотрщик, значение было просто 0. Почему это?Разве значения "результатов" не должны быть address_components, formatted_address, geometry, place_id и типами?

1 Ответ

0 голосов
/ 29 мая 2018

Можете ли вы попробовать

if let results = json["results"] as? [[String:Any]] {

   if let first = results[0] as? [String:Any] {
          print(first["formatted_address"])
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...