2013-05-02 6 views
18

Mam ciąg JSON i potrzebuję pomocy do deserializacji go.C# .net jak deserializować obiekt złożony z JSON

nic nie działało dla mnie .. to jest 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 

    } 

    ] 

} 

] 

} 

Mam przykład z klas, ale nie mam do korzystania z tych klas, i nie przeszkadza przy użyciu niektórych innych klas. są zajęcia:

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

chcę wspomnieć, że mam Newtonsoft.Json już więc mogę korzystać z niektórych funkcji stamtąd.

Jak mogę to zrobić? dzięki.

+0

Czy jest zgłaszany wyjątek? Co to jest komunikat o błędzie? Czy mógłbyś opublikować kod deserializacji? –

+0

Nie ma żadnego wyjątku, po prostu nie otrzymuję żadnych danych.i uzyskanie tego w krótkim widoku: Nazwa "nie istnieje w bieżącym kontekście" –

+1

Sprawdź odpowiedzi i sprawdź tę, aby zamknąć to pytanie. – filipko

Odpowiedz

34

Używam tego w moim kodzie i działa dobrze

poniżej jest kawałek kodu, który trzeba napisać

using System.Web.Script.Serialization; 

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

FYI: jest to w System.Web.Extensions.dll –

25

powinny być tylko to:

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

Możesz wkleić ciąg json tutaj: http://json2csharp.com/ by sprawdzić zajęcia są poprawne.

+0

Próbowałem tego, ale dostaję tylko "Nazwa" nie istnieje w bieżącym kontekście "podczas wchodzenia do szybkiego widoku –

+0

Czy wypróbowałeś zajęcia na stronie internetowej, którą podłączyłem? Widzę, że różnią się tym, że używają Listy zamiast tablic w klasach RootObject i Response. Nie jestem pewien, czy to by coś zmieniło. – stevepkr84

+0

Tak, zmieniłem go na test, ale oryginał był z tej strony –

12

Jeśli używasz C# 2010 lub nowszy, można użyć dynamic type:

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

Następnie można uzyskać dostęp do atrybutów i tablic dynamicznych obiektu za pomocą kropki notacji:

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

Mogło być dobrym pomysłem, ale nie działa dla mnie: ** Nie można znaleźć jednego lub więcej typów wymaganych do kompilacji dynamicznego wyrażenia. Brakuje referencji ** –

+0

Działa pięknie. – batoutofhell

0

używam następujący:

using System.Web.Script.Serialization;  

    ... 

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

miałem scenariusza, a ten pomógł mi

JObject objParserd = JObject .Parse (jsonString);

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

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

5

Pierwszy pakiet intall newtonsoft.json do visual studio przy użyciu Nuget menedżera pakietów następnie dodaj następujący kod,

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

shareInfo jest klasa:

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

Podczas tego fragmentu kodu może rozwiązać pytanie, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-answerssedwersje) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również starać się nie tłumić kodu za pomocą komentarzy wyjaśniających, co zmniejsza czytelność zarówno kodu, jak i objaśnień! – kayess

0

I rozwiązać ten problem, aby dodać setera publicznego dla wszystkich właściwości, które powinny być deserializowane.

Powiązane problemy