2014-06-15 22 views
9

Ich habe eine Zeichenfolge mit Json. Es sieht so aus:Daten aus JSON String extrahieren

"status_code":200, 
"status_txt":"OK", 
"data": 
{ 
    "img_name":"D9Y3z.png", 
    "img_url":"http:\/\/s1.uploads.im\/D9Y3z.png", 
    "img_view":"http:\/\/uploads.im\/D9Y3z.png", 
    "img_width":"167", 
    "img_height":"288", 
    "img_attr":"width=\"167\" height=\"288\"", 
    "img_size":"36.1 KB", 
    "img_bytes":36981, 
    "thumb_url":"http:\/\/s1.uploads.im\/t\/D9Y3z.png", 
    "thumb_width":360, 
    "thumb_height":360, 
    "source":"http:\/\/www.google.com\/images\/srpr\/nav_logo66.png", 
    "resized":"0", 
    "delete_key":"df149b075ab68c38" 
} 

Ich versuche, die "img_url" zu bekommen. Ich habe Json.NET installiert und Ive fand ähnliche Fragen hier ..

zum Beispiel so etwas wie diese:

JObject o = JObject.Parse("{'People':[{'Name':'Jeff'},{'Name':'Joe'}]}"); 

// get name token of first person and convert to a string 
string name = (string)o.SelectToken("People[0].Name"); 

In meinem Fall habe ich ("People[0].Name") zu ("img_url") geändert, ("img_url[0]) etc..no Glück

jetzt

Dies ist mein Code:

public string tempJson { get; set; } 
public ActionResult SaveUploadedFile(string test) 
{ 
    using (WebResponse wrs = wrq.GetResponse()) 
    using (Stream stream = wrs.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     string json = reader.ReadToEnd(); 
     tempJson = json; 
    } 
} 

muss ich etwas mit der Zeichenfolge zu tun, bevor ich den Wert extrahieren? Danke!

+0

Schauen Sie genau auf Ihre JSON. Die Eigenschaft "img_url" ist Teil eines JSON-Objekts, das wiederum einer JSON-Eigenschaft zugeordnet ist. Wie heißt diese Eigenschaft? – elgonzo

+0

Sie meinen Daten? Ich bin verloren? – user2915962

+2

Ja, "Daten". Daher solltest du 'SelectToken (" data.img_url ") verwenden;' – elgonzo

Antwort

30

img_url ist nicht eine Eigenschaft des Wurzelobjekts - es ist eine Eigenschaft von data ob ject:

var obj = JObject.Parse(json); 
var url = (string)obj["data"]["img_url"]; // http://s1.uploads.im/D9Y3z.png 

Eine weitere Option:

var url = (string)obj.SelectToken("data.img_url"); 
+1

+1 Gut . Jetzt muss ich meine Antwort nicht mehr beenden: -b – elgonzo

+3

@elgonzo thanks. Das Lesen von Eigenschaften mit Indexern beinhaltet nicht das Parsen von JPath, aber ich mag die SelectToken Option für eine viel bessere Lesbarkeit (und es ist sicherer) –

11

Mit Hilfe von this site

var obj = JsonConvert.DeserializeObject<RootObject>(json); 
Console.WriteLine(obj.data.img_url); 

public class Data 
{ 
    public string img_name { get; set; } 
    public string img_url { get; set; } 
    public string img_view { get; set; } 
    public string img_width { get; set; } 
    public string img_height { get; set; } 
    public string img_attr { get; set; } 
    public string img_size { get; set; } 
    public int img_bytes { get; set; } 
    public string thumb_url { get; set; } 
    public int thumb_width { get; set; } 
    public int thumb_height { get; set; } 
    public string source { get; set; } 
    public string resized { get; set; } 
    public string delete_key { get; set; } 
} 

public class RootObject 
{ 
    public int status_code { get; set; } 
    public string status_txt { get; set; } 
    public Data data { get; set; } 
} 

Sie können auch mit der Verwendung von dynamic Stichwort dasselbe tun (ohne über Klassen deklariert)

dynamic obj = JsonConvert.DeserializeObject(json); 
Console.WriteLine(obj.data.img_url);