繁体   English   中英

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

[英]Deserializing a JSON into a C# List of Objects

我正在尝试从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; }
        }
    }
}

我认为你应该使用

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

我会尝试一些(如果我是你的话):

删除Places places = new Places();

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

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

1.只参加地方课程。

2.初始化List<Place> places=new List<Place>()

3.使用场所反序列化

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM