2013-04-18 6 views
7

Ich versuche, eine JSON-Antwort von foursquare in Objekte zurück zu drehen. Ich bekomme so etwas wie dieses zurückWas vermisse ich? 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" 
     } 
     ] 
    } 
} 

ich eine Klasse wie dieses

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; 

Doch Venues gemacht ist immer null. Ich bin mir nicht sicher warum.

+0

chobo2, Ihr JSON ist ungültig und es fehlen viele Kommas zwischen den Feldern. Also hat RetSharp recht. – I4V

+0

Angenommen, dass json gültig ist. Es kommt von viereckig (es muss funktionieren ....). Das Problem, das Sie beschreiben, war, weil ich es von ihrem Live-Tool kopiert habe, was anscheinend die Anführungsstriche streift ... die Anfrage durch Code hat Anführungszeichen. – chobo2

Antwort

17

Ok ich fand dieses großartige Werkzeug http://json2csharp.com/, die den JSON in Objekte konvertiert. Ich fand, dass ich eine weitere Verpackung brauchte, damit es funktionierte.

+11

Oder in Visual Studio können Sie auf 'Bearbeiten-> Paste special-> als Json' klicken und es tut es für Sie – cheesemacfly

0

Wenn ich in die richtige Richtung gehe dann ist ur JSON nicht Valid

Error:Strings should be wrapped in double quotes 

holen jsonformatter validierten

[UPDATED]

Valid JSON wäre wie: -

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

richtig, aber es ist gültig json. Es war, dass ich die Ergebnisse von ihrem on-line-Werkzeug nahm, das den json zurückbringt (https://developer.foursquare.com/docs/explore#req=venues/search%3Fll%3D40.7,-74%26groceryStoreId%3D4bf58dd8d48988d118951735) Was scheint die Zitate wegzuziehen.Ich habe erneut gepostet, was ich in meinem Code zurückbekomme. – chobo2

0

Die JSON-Deserialisierung in .NET-Objekte ist eine sinnvolle Angelegenheit. Ihre Eigenschaftsnamen stimmen nicht mit den JSON-Tags überein, und deshalb erhalten Sie bei der Deserialisierung NULL zurück.

1

Sie müssen einfach eine Ebene tiefer in der JSON-Antwort gehen. Eine Ebene höher als die venues Eigenschaft ist die response Eigenschaft, die derzeit nicht in Ihrer Response Klasse vertreten ist.

Sie haben zwei Möglichkeiten, dies zu lösen.

1) Fügen Sie eine weitere Wickel Antwort-Objekt, das die fehlenden response Eigenschaft enthält

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

Und die Ausführung der Anfrage ...

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

2) Ignorieren Sie die meta Eigenschaft und beginnen bei der Parsen response Eigentum.

* Nebenbei, es sieht so aus, als ob die meta Eigenschaft der JSON-Antwort ein HTTP-Statuscode sein könnte. Wenn es ist und Sie es immer noch brauchen, bietet RestSharp das auch für Sie an (siehe unten).

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

Dies erfordert jedoch, dass RestSharp angewiesen wird, mit der Analyse der Antwort zu beginnen.

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

Diese Antwort adressiert das Kernproblem des OP. – wlf