2016-05-09 6 views
2

Ich versuche, meine Json Antwort, wie diese aussehen zu analysieren:Kann nicht json Liste benutzerdefinierte analysieren Objekte

{ 
"response": 
    { 
    "status":"ok", 
    "userTier":"developer", 
    "total":12075, 
    "startIndex":1, 
    "pageSize":10, 
    "currentPage":1, 
    "pages":1208, 
    "orderBy":"relevance", 
    "results":[ 
     { 
     "type":"article", 
     "sectionId":"world", 
     "webTitle":"Putin-themed cafe opens in Siberia", 
     "webPublicationDate":"2016-04-13T14:56:42Z", 
     "id":"world/2016/apr/13/vladimir-putin-themed-cafe-opens-in-siberia", 
     "webUrl":"http://www.theguardian.com/world/2016/apr/13/vladimir-putin-themed-cafe-opens-in-siberia", 
     "apiUrl":"http://content.guardianapis.com/world/2016/apr/13/vladimir-putin-themed-cafe-opens-in-siberia", 
     "sectionName":"World news" 
     }, 
     { 
     "type":"article", 
     "sectionId":"world", 
     "webTitle":"Spain issues arrest warrants for Russian officials close to Putin", 
     "webPublicationDate":"2016-05-04T16:59:27Z", 
     "id":"world/2016/may/04/spain-issues-arrest-warrants-for-russian-officials-close-to-putin", 
     "webUrl":"http://www.theguardian.com/world/2016/may/04/spain-issues-arrest-warrants-for-russian-officials-close-to-putin", 
     "apiUrl":"http://content.guardianapis.com/world/2016/may/04/spain-issues-arrest-warrants-for-russian-officials-close-to-putin", 
     "sectionName":"World news" 
     } 

ich meine Klassen erstellt json2csharp.com mit (diese Zeichenfolge eingeben: http://content.guardianapis.com/search?q=putin&api-key=6392a258-3c53-4e76-87ec-e9092356fa74) Aber ich hatte die Folgefehler, wenn ich versuchte, es zu analysieren:

var model = JsonConvert.DeserializeObject<List<NewsModel.RootObject>>(data); 

Eigentlich habe ich meine Daten auf diese Weise:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://content.guardianapis.com/search?q=putin&api-key=6392a258-3c53-4e76-87ec-e9092356fa74"); 
request.Method = "GET"; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
if (response.StatusCode == HttpStatusCode.OK) 
{ 
    Stream receiveStream = response.GetResponseStream(); 
    StreamReader readStream = null; 

    if (response.CharacterSet == "") 
     readStream = new StreamReader(receiveStream); 
    else 
     readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet)); 

     string data = readStream.ReadToEnd(); 
     DataSet ds = new DataSet(); 
     StringReader reader = new StringReader(data); 

// parse here 
} 

Etwas schlecht mit JSON Parsing. Nachricht: Das aktuelle JSON-Objekt (z. B. {"name": "Wert"}) kann nicht in Typ 'System.Collections.Generic.List 1[sample.NewsModel+RootObject]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. Path 'response', line 1, position 12.Something bad with json parsing. Message: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List 1 [sample.NewsModel + RootObject]' deserialisiert werden, da der Typ ein JSON-Array erfordert (zB [1,2,3]) um korrekt zu deserialisieren. Um diesen Fehler zu beheben, ändern Sie entweder das JSON in ein JSON-Array (zB [1,2,3]) oder ändern Sie den deserialisierten Typ, so dass es ein normaler .NET-Typ ist (zB kein primitiver Typ wie ganze Zahlen, keine Sammlung) Typ wie ein Array oder eine Liste), die von einem JSON Objekt deserialisiert werden können. JsonObjectAttribute kann auch zu dem Typ hinzugefügt werden, um es zu erzwingen, von einem JSON-Objekt zu deserialisieren. Pfad ‚response‘, Zeile 1, Position 12.

Antwort

2

Es sieht aus wie Sie versuchen, die Antwort als ein Array deserialisieren (Antwort würde [...] sein) anstelle eines einzelnen Objekts (Antwort, wie gezeigt, {...}). Ändern Sie Ihren Code:

var model = JsonConvert.DeserializeObject<NewsModel.RootObject>(data);

0

diesen Code Versuchen.

using System.Net; 

string requestUrl = String.Format("http://content.guardianapis.com/search?q=putin&api-key=6392a258-3c53-4e76-87ec-e9092356fa74"); 
string json = new WebClient().DownloadString(requestUrl); 

var jss = new JavaScriptSerializer(); 
var dict = jss.Deserialize<Dictionary<string, dynamic>>(json.ToString()); 
object result = dict["results"]; 

foreach (object items in result as System.Collections.ArrayList) 
{ 
    Dictionary<string, object> item = (Dictionary<string, object>)items; 
    string type = item["type"]; 
    string sectionId = item["sectionId"]; 
    ... 
    ... 
    ... 
    //or 
    //foreach(object item in items) { } 
}