2013-04-18 1 views
7

Я пытаюсь превратить ответ json назад из foursquare в объекты. Я получаю что-то вроде этого назадЧто мне не хватает? RestSharp не будет deserialize Json

{ 
    "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 всегда нуль. Однако я не знаю, почему.

+0

chobo2, ваш json недействителен и отсутствует много запятых между полями. Так что RetSharp прав. – I4V

+0

Предположим, что json действителен. Он исходит из четырех (он должен работать ...). Проблема, которую вы описываете, состояла в том, что я скопировал ее из своего реального инструмента, что, по-видимому, вытесняет цитаты ... запрос через код имеет котировки. – chobo2

ответ

17

Ok Я нашел этот замечательный инструмент http://json2csharp.com/, который преобразует json в объекты. Я обнаружил, что мне нужна еще одна упаковка, чтобы заставить ее работать.

+11

Или в Visual Studio вы можете нажать «Редактировать-> Вставить special-> как Json', и он делает это за вас – cheesemacfly

0

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

Error:Strings should be wrapped in double quotes 

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

[ОБНОВЛЕНО]

Valid 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" 
}   
] 
} 

} 
+0

правый, но действительно json. Это было то, что я взял результаты из своего онлайн-инструмента, который возвращает json назад (https://developer.foursquare.com/docs/explore#req=venues/search%3Fll%3D40.7,-74%26groceryStoreId%3D4bf58dd8d48988d118951735) что, кажется, отбрасывает цитаты.Я повторно отправил сообщение с тем, что получаю в своем коде. – chobo2

0

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

1

Вам просто нужно пройти уровень глубже в ответ 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 Недвижимость.

* В стороне, похоже, что свойство ответа 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 
+0

В этом ответе рассматривается основная проблема OP. – wlf