Что мне не хватает? RestSharp не будет десериализовать Json

Я пытаюсь превратить json-ответ обратно из Foursquare в объекты. Я получаю что-то вроде этого обратно

   {
   "meta":{
      "code":200
   },
   "response":{
      "venues":[
         {
            "id":"4abfb58ef964a520be9120e3",
            "name":"Costco",
            "contact":{
               "phone":"6045967435",
               "formattedPhone":"(604) 596-7435"
            },
            "location":{
               "address":"7423 King George Hwy",
               "crossStreet":"btw 76 Avenue & 73A Avenue",
               "lat":49.138259617056015,
               "lng":-122.84723281860352,
               "distance":19000,
               "postalCode":"V3W 5A8",
               "city":"Surrey",
               "state":"BC",
               "country":"Canada",
               "cc":"CA"
            },
            "canonicalUrl":"https:\/\/foursquare.com\/v\/costco\/4abfb58ef964a520be9120e3",
            "categories":[
               {
                  "id":"4bf58dd8d48988d1f6941735",
                  "name":"Department Store",
                  "pluralName":"Department Stores",
                  "shortName":"Department Store",
                  "icon":{
                     "prefix":"https:\/\/foursquare.com\/img\/categories_v2\/shops\/departmentstore_",
                     "suffix":".png"
                  },
                  "primary":true
               }
            ],
            "verified":true,
            "restricted":true,
            "stats":{
               "checkinsCount":2038,
               "usersCount":533,
               "tipCount":12
            },
            "url":"http:\/\/www.costco.ca",
            "specials":{
               "count":0,
               "items":[

               ]
            },
            "hereNow":{
               "count":0,
               "groups":[

               ]
            },
            "referralId":"v-1366316196"
         }
      ]
   }
}

Я сделал такой класс

 public class Response
    {
        public string Meta { get; set; }
        public List<Venue> Venues { get; set; }
    }

  public class Venue
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public Contact Contact { get; set; }
        public Location Location { get; set; }
        public string CanonicalUrl { get; set; }
        public Categories Categories { get; set; }
        public bool Verified { get; set; }
    }

 var response = client.Execute<Response>(request);
       var test = response.Data;

Тем не менее, Venues всегда равно нулю. Я не уверен, почему.


person chobo2    schedule 18.04.2013    source источник
comment
chobo2, ваш json недействителен и отсутствует много запятых между полями. Так что RetSharp прав.   -  person I4V    schedule 19.04.2013
comment
Предположим, что json действителен. Это исходит от Foursquare (это должно работать....). Проблема, которую вы описываете, заключалась в том, что я скопировал ее из их живого инструмента, который, по-видимому, удаляет кавычки... запрос через код имеет кавычки.   -  person chobo2    schedule 19.04.2013


Ответы (3)


Вам просто нужно углубиться в ответ JSON. На один уровень выше свойства venues находится свойство response, которое в настоящее время не представлено в вашем классе Response.

У вас есть два способа решить эту проблему.

1) Добавьте еще один объект ответа упаковки, который содержит отсутствующее свойство response

// this is the new wrapping object
public class FourSquareResponse
{
    public string Meta { get; set; }
    public VenueResponse Response { get; set; } // previously missing
}

public class VenueResponse
{
    public List<Venue> Venues { get; set; }
}

public class Venue
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Contact Contact { get; set; }
    public Location Location { get; set; }
    public string CanonicalUrl { get; set; }
    public Categories Categories { get; set; }
    public bool Verified { get; set; }
}

И выполнение запроса...

var request = new RestRequest(uri);
var response = client.Execute<Response>(request);

2) Игнорировать свойство meta и начать синтаксический анализ свойства response.

* Кроме того, похоже, что свойство meta ответа JSON может быть кодом состояния HTTP. Если это так и вам это все еще нужно, RestSharp также предоставит вам это (см. Ниже).

public class Response
{
    public string Meta { get; set; }
    public List<Venue> Venues { get; set; }
}

public class Venue
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Contact Contact { get; set; }
    public Location Location { get; set; }
    public string CanonicalUrl { get; set; }
    public Categories Categories { get; set; }
    public bool Verified { get; set; }
}

Однако для этого потребуется сообщить RestSharp, с чего начать разбор ответа.

var request = new RestRequest(uri)
{
    RootElement = "response"
};
var response = client.Execute<Response>(request);

// and the HTTP status (if that's what you need)
response.StatusCode
person Ryan V    schedule 25.02.2016
comment
Этот ответ касается основной проблемы ОП. - person wlf; 02.04.2017

Если я иду в правильном направлении, то ваш JSON не Valid

Error:Strings should be wrapped in double quotes

Получите подтверждение jsonformatter

[ОБНОВЛЕНО]

Действительный JSON будет выглядеть так: -

{
"meta": {
    "code": 200
        },
    "notifications": 
        [
            {
                "type": "notificationTray",
                "item": {
            "unreadCount": 0
                }
            }
        ],
    "response": {
    "venues": [
        {
            "id": "4e15d1348877cd5712112a44",
            "name": "The Arena",
    "contact": { },
    "location": {
        "address": "110 Wall Street",
        "lat": 40.70432634495503,
        "lng": -74.0055421062419,
        "distance": 671,
        "city": "New York",
        "state": "NY",
        "country": "United States",
        "cc": "US"
    },
    "canonicalUrl": "https://foursquare.com/v/the-arena/4e15d1348877cd5712112a44",
    "categories": [
        {
            "id": "4bf58dd8d48988d1e4941735",
            "name": "Campground",
    "pluralName": "Campgrounds",
    "shortName": "Campground",
    "icon": {
            "prefix": "https://foursquare.com/img/categories_v2/parks_outdoors/campground_",
            "suffix": ".png"
    },
    "primary": true
}
],
"verified": false,
"stats": {
        "checkinsCount": 149,
        "usersCount": 25,
        "tipCount": 4
},
"specials": {
        "count": 0,
        "items": [ ]
},
"hereNow": {
        "count": 0,
        "groups": [ ]
},
"referralId": "v-1366314443"
}         
]
}

}
person Shubh    schedule 18.04.2013
comment
правильно, но это действительно json. Дело в том, что я взял результаты из их онлайн-инструмента, который возвращает json обратно(developer.foursquare.com/docs/explore#req=venues/), что, кажется, убирает кавычки. Я повторно опубликовал то, что я возвращаю в свой код. - person chobo2; 19.04.2013

Десериализация JSON в объекты .NET чувствительна к регистру. Имена ваших свойств не соответствуют тегам JSON должным образом, и поэтому, когда вы пытаетесь десериализовать, вы возвращаете NULL.

person JoshMachol    schedule 20.04.2013