将JSON反序列化为C#对象列表

时间:2016-10-06 13:42:16

标签: c# json serialization google-places-api

我正在尝试从google places api反序列化JSON。我的自定义类设置如下,我的代码看起来像这样。我的程序在运行时不会抛出任何错误,但我的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.906474&radius=500&type=restaurant&name=cruise&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; }
        }
    }
}

3 个答案:

答案 0 :(得分: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.906474&radius=500&type=restaurant&name=cruise&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 :(得分:0)

我会尝试一些事情(如果我是你):

删除 Places places = new Places();

替换 places = JsonConvert.DeserializeObject(responseFromServer); 通过 Places places = JsonConvert.DeserializeObject(responseFromServer);

并在您的类中添加一个默认构造函数,就像您在PlacesDictionary中添加一样。

答案 2 :(得分:0)

1.只有Place class。

2.Initialize OnClick

3.使用地点反序列化

Button1