Геокодирование вызов REST C # парсинг JSON - PullRequest
0 голосов
/ 15 декабря 2018

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

https://geocoder.api.here.com/6.2/geocode.json?app_id=[MY APP ID] & app_code = [МОЙ APP CODE] & searchtext = chester

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

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

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

Вызов возвращается с состоянием OK:

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; }
    }

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

Ответы [ 2 ]

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

Если вы хотите проанализировать только одну пару значений ключа из 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, приведенного в ссылке)

enter image description here

Примечание: Вам необходимо установить пакет 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;
0 голосов
/ 15 декабря 2018

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

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