Десериализация JSON в список объектов C #

#c# #json #serialization #google-places-api

#c# #json #сериализация #google-places-api

Вопрос:

Я пытаюсь десериализовать JSON из API Google places. Мой пользовательский класс настроен следующим образом, и мой код выглядит следующим образом. Моя программа не выдает ошибок при запуске, но мой объект places имеет значение null.

 class PlacesDictionary
{

    public void placesDictionary()
    { }

    public Places GetPlaces()
    {
        Places places = new Places();

        string apiKey = "I have an apiKey";
        string googleUrl;
        googleUrl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=43.038902,-87.906474amp;radius=500amp;type=restaurantamp;name=cruiseamp;key="   apiKey;

        WebRequest request = WebRequest.Create(googleUrl);
        request.Method = "GET";
        request.ContentType = "application/x-www-form-urlencoded";
        WebResponse response = request.GetResponse();
        Console.WriteLine(((HttpWebResponse)response).StatusDescription);
        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        places = JsonConvert.DeserializeObject<Places>(responseFromServer);

        Console.WriteLine(responseFromServer);
        Console.ReadLine();
        reader.Close();
        dataStream.Close();
        response.Close();

        return places;
    }
}

public class Places
{
    public List<Place> places { get; set; }

    public class Place
    {
        public Geometry geometry { get; set; }
        public string icon { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        public OpeningHours opening_hours { get; set; }
        public List<Photo> photos { get; set; }
        public string place_id { get; set; }
        public int price_level { get; set; }
        public double rating { get; set; }
        public string reference { get; set; }
        public string scope { get; set; }
        public List<string> types { get; set; }
        public string vicinity { get; set; }

        public class Location
        {
            public double lat { get; set; }
            public double lng { get; set; }
        }

        public class Northeast
        {
            public double lat { get; set; }
            public double lng { get; set; }
        }

        public class Southwest
        {
            public double lat { get; set; }
            public double lng { get; set; }
        }

        public class Viewport
        {
            public Northeast northeast { get; set; }
            public Southwest southwest { get; set; }
        }

        public class Geometry
        {
            public Location location { get; set; }
            public Viewport viewport { get; set; }
        }

        public class OpeningHours
        {
            public bool open_now { get; set; }
            public List<object> weekday_text { get; set; }
        }

        public class Photo
        {
            public int height { get; set; }
            public List<string> html_attributions { get; set; }
            public string photo_reference { get; set; }
            public int width { get; set; }
        }
    }
}
  

Комментарии:

1. Где находится ваш объект Restaurant?

2. Извините, места будут содержать рестораны

3. Если вы не добавите JSON в вопрос, любой ответ будет просто предположением.

4. Я отредактировал свой ответ, и я только что попробовал, и это работает.

5. Потрясающе, это потому, что у меня не было переменных для полных результатов status, next page token и html_attributions

Ответ №1:

Я думаю, вам следует использовать

 List<Place> places = JsonConvert.DeserializeObject<List<Place>>(responseFromServer);
  

вместо

 places = JsonConvert.DeserializeObject<Places>(responseFromServer);
  

и не забудьте удалить следующую строку

  Places places = new Places();
  

Редактировать: полный ответ

      static void Main(string[] args)
     {
           string apiKey = "your api key";
           string googleUrl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=43.038902,-87.906474amp;radius=500amp;type=restaurantamp;name=cruiseamp;key="   apiKey;

            WebRequest request = WebRequest.Create(googleUrl);
            request.Method = "GET";
            request.ContentType = "application/x-www-form-urlencoded";
            WebResponse response = request.GetResponse();
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            //StreamWriter wr = new StreamWriter("json.txt");
            //wr.WriteLine(responseFromServer);
            //wr.Flush();
            //To see what it is inside json
            Result results = JsonConvert.DeserializeObject<Result>(responseFromServer);

            Console.WriteLine(responseFromServer);
            Console.ReadLine();
            reader.Close();
            dataStream.Close();
            response.Close();

        }
    }

    public class Result
    {
        public List<HTMLAttribution> html_attributions { get; set; }
        public string next_page_token { get; set; }
        public List<Place> results { get; set; }
        public string status { get; set; }

        //Definations of Classes
        public class HTMLAttribution { } //I don't what it is. It is empty for your url.

        public class Place
        {
            public Geometry geometry { get; set; }
            public string icon { get; set; }
            public string id { get; set; }
            public string name { get; set; }
            public OpeningHours opening_hours { get; set; }
            public List<Photo> photos { get; set; }
            public string place_id { get; set; }
            public int price_level { get; set; }
            public double rating { get; set; }
            public string reference { get; set; }
            public string scope { get; set; }
            public List<string> types { get; set; }
            public string vicinity { get; set; }

            public class Geometry
            {
                public Location location { get; set; }
                public Viewport viewport { get; set; }
            }
            public class Location
            {
                public double lat { get; set; }
                public double lng { get; set; }
            }
            public class Viewport
            {
                public Northeast northeast { get; set; }
                public Southwest southwest { get; set; }
            }
            public class Northeast
            {
                public double lat { get; set; }
                public double lng { get; set; }
            }

            public class Southwest
            {
                public double lat { get; set; }
                public double lng { get; set; }
            }
            public class OpeningHours
            {
                public bool open_now { get; set; }
                public List<object> weekday_text { get; set; }
            }
            public class Photo
            {
                public int height { get; set; }
                public List<string> html_attributions { get; set; }
                public string photo_reference { get; set; }
                public int width { get; set; }
            }
        }
    }
  

Комментарии:

1. Нужно ли мне изменять настройки моего класса, поскольку places уже является списком?

2. Не меняйте класс Place, только удалите класс Places.

3. Честно говоря, весь класс Places не нужен, равно как и свойство list places. Все, что вам нужно, это Класс Place .

4. Это устраняет ошибку, созданную первым предложением, и создает объект, который я вижу при отладке, но не создает список объектов, и все свойства объекта равны нулю.

Ответ №2:

Я бы попробовал что-нибудь (на вашем месте) :

Удалить Places places = new Places();

заменить places = JsonConvert.DeserializeObject(responseFromServer); на Places places = JsonConvert.DeserializeObject(responseFromServer);

и добавьте конструктор по умолчанию в свой класс Places, например, у вас есть add в PlacesDictionary.

Комментарии:

1. Да, извините, места будут содержать рестораны, когда это сработает

Ответ №3:

1. Просто используйте только класс Place.

2.Инициализируйте List<Place> places=new List<Place>()

3. Десериализация с использованием places

 places = JsonConvert.DeserializeObject<places>(responseFromServer);
  

Комментарии:

1. у меня есть класс places, который является общедоступным списком<Place> places { get; set; } . Вы говорите, что я могу удалить это и просто сериализовать в список<Place> вместо того, чтобы иметь его собственный класс?

2. places = JsonConvert. DeserializeObject<Places>(responseFromServer); Если Places больше не является классом, его нельзя использовать как тип

3. Извините, что мой неверный измененный ответ на экземпляр списка «places» при десериализации, yes Places больше не будет классом