2013-04-18 13 views
7

Sto cercando di trasformare una risposta json da foursquare in oggetti. Ottengo qualcosa di simile a questo ritornoCosa mi manca? RestSharp non deserializza 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" 
     } 
     ] 
    } 
} 

ho fatto una classe come questa

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; 

Eppure Venues è sempre nullo. Non sono sicuro del perché comunque.

+0

chobo2, il tuo json non è valido e manca molte virgole tra i campi. Quindi RetSharp ha ragione. – I4V

+0

Supponiamo che JSON sia valido. Viene da Foursquare (deve funzionare ...). Il problema che stai descrivendo è stato perché l'ho copiato dal loro strumento live e ciò che apparentemente spoglia le virgolette ... la richiesta attraverso il codice ha virgolette. – chobo2

risposta

17

Ok ho trovato questo ottimo strumento http://json2csharp.com/ che converte il json in oggetti. Ho trovato attraverso questo ho avuto bisogno di un altro involucro per farlo funzionare.

+11

Oppure in Visual Studio puoi fare clic su "Modifica-> Incolla speciale-> come Json' e lo fa per te – cheesemacfly

0

se sto andando nella giusta direzione, allora, ur JSON non è Valid

Error:Strings should be wrapped in double quotes 

Get it convalidato jsonformatter

[AGGIORNATO]

valido JSON sarebbe come: -

{ 
"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

ma è valido json. È stato che ho preso i risultati dal loro strumento online che restituisce il json back (https://developer.foursquare.com/docs/explore#req=venues/search%3Fll%3D40.7,-74%26groceryStoreId%3D4bf58dd8d48988d118951735) quello che sembra togliere le virgolette.Ho ripubblicato con quello che sto tornando nel mio codice. – chobo2

0

La deserializzazione JSON su oggetti .NET è case sensitive. I nomi delle tue proprietà non corrispondono ai tag JSON correttamente, ed è per questo che quando tenti di deserializzare, stai tornando NULL.

1

È sufficiente passare ad un livello più profondo nella risposta JSON. Un livello superiore rispetto alla proprietà è la proprietà response, che non è attualmente rappresentata nella classe Response.

Hai due modi per risolvere questo.

1) Aggiungere un altro oggetto di risposta da imballaggio, che contiene la response proprietà mancante

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

E dare esecuzione alla richiesta ...

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

2) Ignora la proprietà meta e avviare l'analisi al response proprietà.

* Per inciso, sembra che la proprietà meta della risposta JSON possa essere un codice di stato HTTP. Se lo è e ne hai ancora bisogno, RestSharp lo fornisce anche per te (vedi sotto).

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

Tuttavia, questo richiederà RestSharp dice dove avviare l'analisi della risposta.

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

Questa risposta risolve il problema principale dell'OP. – wlf

Problemi correlati