2013-05-02 15 views
18

Ho una stringa JSON e ho bisogno di aiuto per deserializzare.C# .net come deserializzare l'oggetto complesso di JSON

niente ha funzionato per me .. questa è la JSON

{ 
"response": [ 
    { 
    "loopa": "81ED1A646S894309CA1746FD6B57E5BB46EC18D1FAff", 

    "drupa": "D4492C3CCE7D6F839B2BASD2F08577F89A27B4ff", 

    "images": [ 

     { 

     "report": { 

     "nemo": "unknown" 

    }, 

     "status": "rock", 

     "id": "7e6ffe36e-8789e-4c235-87044-56378f08m30df", 

     "market": 1 

}, 

    { 

"report": { 

"nemo": "unknown" 

}, 

"status": "rock", 

"id": "e50e99df3-59563-45673-afj79e-e3f47504sb55e2", 

"market": 1 

    } 

    ] 

} 

] 

} 

ho un esempio di classi, ma non devo usare tali classi, non mi dispiace con alcune altre classi. queste sono le classi:

public class Report 
{ 
    public string nemo { get; set; } 
} 

public class Image 
{ 
    public Report report { get; set; } 
    public string status { get; set; } 
    public string id { get; set; } 
    public int market { get; set; } 
} 

public class Response 
{ 
    public string loopa { get; set; } 
    public string drupa{ get; set; } 
    public Image[] images { get; set; } 
} 

public class RootObject 
{ 
    public Response[] response { get; set; } 
} 

voglio dire che ho già Newtonsoft.Json modo da poter utilizzare alcune funzioni da lì.

come posso fare questo? grazie.

+0

C'è qualche eccezione che viene lanciata? Qual è il messaggio di errore? Potresti per favore postare il codice di deserializzazione? –

+0

non c'è alcuna eccezione non sto ottenendo alcun dato.e ottenere questo nella vista rapida: il nome "non esiste nel contesto attuale" –

+1

Guarda le risposte e controlla quella giusta per chiudere questa domanda. – filipko

risposta

34

Sto usando così nel mio codice e funziona perfettamente

sotto è un pezzo di codice che è necessario scrivere

using System.Web.Script.Serialization; 

JavaScriptSerializer oJS = new JavaScriptSerializer(); 
RootObject oRootObject = new RootObject(); 
oRootObject = oJS.Deserialize<RootObject>(Your JSon String); 
+2

Nota: questo è in System.Web.Extensions.dll –

25

dovrebbe solo essere questo:

var jobject = JsonConvert.DeserializeObject<RootObject>(jsonstring); 

è possibile incollare la stringa JSON a qui: http://json2csharp.com/ per controllare i corsi siano corretti.

+0

ho provato questo, ma sto ottenendo solo "Il nome" non esiste nel contesto attuale "quando si entra nella vista rapida –

+0

Hai provato le classi secondo il sito web che ho collegato? Vedo che sono diversi in quanto utilizzano List piuttosto che array nelle classi RootObject e Response. Non sono sicuro se farebbe la differenza. – stevepkr84

+0

sì, l'ho cambiato per un test, ma l'originale era da questo sito –

12

Se si utilizza C# 2010 o più recente, è possibile utilizzare dynamic type:

dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring); 

Quindi è possibile accedere agli attributi e le matrici in oggetto dinamico usando la notazione punto:

string nemo = json.response[0].images[0].report.nemo; 
+0

Potrebbe essere stata una buona idea, ma non funzionava per me: ** Non è possibile trovare uno o più tipi necessari per compilare un'espressione dinamica. Ti manca un riferimento ** –

+0

Funziona magnificamente. – batoutofhell

0

Sto usando seguente:

using System.Web.Script.Serialization;  

    ... 

    public static T ParseResponse<T>(string data) 
    { 
     return new JavaScriptSerializer().Deserialize<T>(data); 
    } 
2

ho avuto uno scenario, e questo mi ha aiutato

JObject objParserd = JObject .Parse (jsonString);

JObject arrayObject1 = (JObject) objParserd ["d"];

D myOutput = JsonConvert .DeserializeObject <D> (arrayObject1.ToString());

5

primo pacchetto intall newtonsoft.json per Visual Studio utilizzando NuGet gestore di pacchetti quindi aggiungere codice riportato di seguito,

ClassName ObjectName = JsonConvert.DeserializeObject <ClassName> (jsonObject); 
0

shareInfo è Classe:

public class ShareInfo 
     { 
      [JsonIgnore] 
      public readonly DateTime Timestamp = DateTime.Now; 
      [JsonProperty("sharename")] 
      public string ShareName = null; 
      [JsonProperty("readystate")] 
      public string ReadyState = null; 
      [JsonProperty("created")] 
      [JsonConverter(typeof(Newtonsoft.Json.Converters.UnixDateTimeConverter))] 
      public DateTime? CreatedUtc = null; 
      [JsonProperty("title")] 
      public string Title = null; 
      [JsonProperty("getturl")] 
      public string GettUrl = null; 
      [JsonProperty("userid")] 
      public string UserId = null; 
      [JsonProperty("fullname")] 
      public string Fullname = null; 
      [JsonProperty("files")] 
      public GettFile.FileInfo[] Files = new GettFile.FileInfo[0]; 
     } 

// POST request. 
      var gett = new WebClient { Encoding = Encoding.UTF8 }; 
      gett.Headers.Add("Content-Type", "application/json"); 
      byte[] request = Encoding.UTF8.GetBytes(jsonArgument.ToString()); 
      byte[] response = gett.UploadData(baseUri.Uri, request); 

      // Response. 
      var shareInfo = JsonConvert.DeserializeObject<ShareInfo>(Encoding.UTF8.GetString(response)); 
2
public static void Main(string[] args) 
{ 
    string json = @" { 
    ""children"": [ 
      { 
     ""url"": ""foo.pdf"", 
       ""expanded"": false, 
       ""label"": ""E14288-Passive-40085-2014_09_26.pdf"", 
       ""last_modified"": ""2014-09-28T11:19:49.000Z"", 
       ""type"": 1, 
       ""size"": 60929 
      } 
     ] 
    }"; 




    var result = JsonConvert.DeserializeObject<ChildrenRootObject>(json); 
    DataTable tbl = DataTableFromObject(result.children); 
} 

public static DataTable DataTableFromObject<T>(IList<T> list) 
{ 
    DataTable tbl = new DataTable(); 
    tbl.TableName = typeof(T).Name; 

    var propertyInfos = typeof(T).GetProperties(); 
    List<string> columnNames = new List<string>(); 

    foreach (PropertyInfo propertyInfo in propertyInfos) 
    { 
     tbl.Columns.Add(propertyInfo.Name, propertyInfo.PropertyType); 
     columnNames.Add(propertyInfo.Name); 
    } 

    foreach(var item in list) 
    { 
     DataRow row = tbl.NewRow(); 
     foreach (var name in columnNames) 
     { 
      row[name] = item.GetType().GetProperty(name).GetValue(item, null); 
     } 

     tbl.Rows.Add(row); 
    } 

    return tbl; 
} 

public class Child 
{ 
    public string url { get; set; } 
    public bool expanded { get; set; } 
    public string label { get; set; } 
    public DateTime last_modified { get; set; } 
    public int type { get; set; } 
    public int size { get; set; } 
} 

public class ChildrenRootObject 
{ 
    public List<Child> children { get; set; } 
} 
+1

Sebbene questo snippet di codice possa risolvere la domanda, [compresa una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-intlely-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni! – kayess

0

ho risolto questo problema da aggiungere un setter pubblico per tutte le proprietà, che dovrebbe essere deserializzato.

Problemi correlati