Вызов REST для геокодирования C# Parsing JSON

Я изо всех сил пытаюсь получить данные, возвращенные из вызова Geocoding REST ниже (я удалил свои app_id и app_code, поэтому вы не можете запустить URL-адрес, как показано ниже):

https://geocoder.api.here.com/6.2/geocode.json?app_id=[MY APP ID] & app_code = [МОЙ КОД ПРИЛОЖЕНИЯ] & searchtext = chester

Пример ответа можно найти здесь:

https://developer.here.com/documentation/geocoder/topics/quick-start-geocode.html

Я знаю, что он возвращает результаты, но я не могу передать результаты в свое приложение C#, я не знаю, неправильно ли я строю систему классов или есть что-то еще, что я делаю неправильно. Я создал приложение, читающее api мест без проблем, но это как-то кажется другим.

Вызов возвращается со статусом ОК:

public void GeoCode()
    {
        // BUILD INITIAL STRING BASED ON PARAMETERS
        string url = "https://geocoder.api.here.com/6.2/geocode.json?app_id=gpZ1Ym7rwuXs6Xj1TsD8&app_code=4UXmaGFTe30LttFgOY7iqQ&searchtext = " + tbLoc.text;
        // RUN THE ASYNCRONOUS COMMAND (I THINK)
        StartCoroutine(GetText(url));
    }

    IEnumerator GetText(string url)
    {
        // CREATE WEB REQUEST WITH SPECIFIED URL
        UnityWebRequest www = UnityWebRequest.Get(url);
        // RETURN RESULTS FROM ASYNC COMMAND
        yield return www.SendWebRequest();
        // PARSE JSON RESPONSE
        RootObject RootObject = JsonUtility.FromJson<RootObject>(www.downloadHandler.text);
        // IF 200 (STATUS OKAY) GATHER RESULTS, ELSE RETURN ERROR
        if (www.responseCode == 200)
        {
            BuildArray(RootObject);
        }
        else
        {
            Debug.Log("Call Failed With Error: " + www.responseCode.ToString());
        }
    }

    private void BuildArray(RootObject RootObject)
    {
        print(RootObject.Response.View[0].Result[0].Location.Address.Label);
    }

Он пытается запустить функцию BuildArray, но возвращает пустую ссылку. (Я просто использую NextPageInformation как самый простой вариант для тестирования)

Ниже представлена ​​структура классов, которую я построил для работы с JSON:

    public class Address
    {
        public string Label { get; set; }
    }

    public class Location
    {
        public Address Address { get; set; }
    }

    public class Result
    {
        public Location Location { get; set; }
    }

    public class View
    {
        public List<Result> Result { get; set; }
    }

    public class Response
    {
        public List<View> View { get; set; }
    }

    public class RootObject
    {
        public Response Response { get; set; }
    }

Может кто-нибудь помочь? Спасибо

Если бы мне нужно было что-то сделать с кучей json, я бы скопировал его, вставил в QuickType.io и заставил его сгенерировать набор классов и использовать инструкции, а затем вернуть его в свою программу. QuickType настолько хорош, что я хотел бы опубликовать его в качестве ответа, но внешние ресурсы несколько временны и не всегда дают хорошие ответы SO. Однако это должно быть универсальное решение для решения этой проблемы, включая некоторые комментарии типа «вставьте эту строку кода в свое приложение, и все будет просто работать», сгенерированный код справки

Caius Jard 15.12.2018 19:58
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
259
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У меня лично были проблемы с анализом вложенных объектов json с помощью JsonUtility. Поэтому я перешел на Newtonsoft Json, и он работает очень хорошо. В вашем случае вам нужно пометить классы как сериализованные с помощью [Serializable] глянь сюда

[Serializable] 
public class Address
    {
        public string Label;
    }

Привет, я добавил в Serializable, как и в своих предыдущих вызовах JSON (не знаю, как я забыл включить его на этот раз!) Но я все еще получаю нулевую ссылку на этикетке.

Kyle Jackson 16.12.2018 20:14

Вы можете вставить сюда JSON?

Mridul Pareek 17.12.2018 02:33

Еще одна вещь, вы создаете RootObject типа RootObject, вам может потребоваться изменить его на rootObject

Mridul Pareek 17.12.2018 02:37

Я вставил пример JSON в свой исходный пост, спасибо

Kyle Jackson 17.12.2018 15:11
Ответ принят как подходящий

Если вы хотите проанализировать только одну пару ключ-значение из json, тогда создание структуры классов будет для вас утомительной работой.

Вместо создания структуры классов вы можете Запрос json с помощью Newtonsoft.

  1. Разберите свой json.
  2. Запрос вашего проанализированного json для получения Label ценность.

//1
JToken jToken = JToken.Parse(jsonString);

//2
string label = jToken["Response"]["View"][0]["Result"][0]["Location"]["Address"]["Label"].ToObject<string>();

Console.WriteLine(label);

Console.ReadLine();

Вывод: (из вашего образца json, указанного в ссылке)

Примечание: Вам необходимо установить пакет newtonsoft.json из nuget и добавить в свою программу пространство имен ниже.

using Newtonsoft.Json.Linq;

Редактировать:

Если вы хотите проанализировать свой полный json, сначала создайте структуру класса, как показано ниже

public class MetaInfo
{
    public DateTime Timestamp { get; set; }
}

public class MatchQuality
{
    public int City { get; set; }
    public List<double> Street { get; set; }
    public int HouseNumber { get; set; }
}

public class DisplayPosition
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public class NavigationPosition
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public class TopLeft
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public class BottomRight
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public class MapView
{
    public TopLeft TopLeft { get; set; }
    public BottomRight BottomRight { get; set; }
}

public class AdditionalData
{
    public string value { get; set; }
    public string key { get; set; }
}

public class Address
{
    public string Label { get; set; }
    public string Country { get; set; }
    public string State { get; set; }
    public string County { get; set; }
    public string City { get; set; }
    public string District { get; set; }
    public string Street { get; set; }
    public string HouseNumber { get; set; }
    public string PostalCode { get; set; }
    public List<AdditionalData> AdditionalData { get; set; }
}

public class Location
{
    public string LocationId { get; set; }
    public string LocationType { get; set; }
    public DisplayPosition DisplayPosition { get; set; }
    public List<NavigationPosition> NavigationPosition { get; set; }
    public MapView MapView { get; set; }
    public Address Address { get; set; }
}

public class Result
{
    public int Relevance { get; set; }
    public string MatchLevel { get; set; }
    public MatchQuality MatchQuality { get; set; }
    public string MatchType { get; set; }
    public Location Location { get; set; }
}

public class View
{
    public string _type { get; set; }
    public int ViewId { get; set; }
    public List<Result> Result { get; set; }
}

public class Response
{
    public MetaInfo MetaInfo { get; set; }
    public List<View> View { get; set; }
}

public class RootObject
{
    public Response Response { get; set; }
}

И затем вы можете десериализовать свой json-файл.

RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString);

Примечание: Вам необходимо добавить в свою программу пространство имен ниже.

using Newtonsoft.Json;

На самом деле я использую довольно много элементов из ответа, это просто тестовая строка, которую я использую, пока я не смогу правильно ее прочитать. Несколько человек уже упомянули Newtonsoft, поэтому я попробую, спасибо.

Kyle Jackson 17.12.2018 14:28

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

er-sho 17.12.2018 14:36

@KyleJackson, ответ обновлен. просмотрите раздел Редактировать: в ответе :)

er-sho 18.12.2018 11:39

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