2016-10-02 2 views
0

Wie kann ich meine Json-Zeichenfolge Klasse konvertierenC# - Wie json String-Klasse umwandeln

das ist mein json

{ "$ id": "1", "Ergebnis": { "$ id": "2", "Datetime": 23.821.964, "list": [{ "$ id": "3", "UserId": 302, "UID": "302_UID", "Titel": "شیشیکک", "Absender": "شیشیکک", "Antwort": "", "Kommentar": "Test 2", "ProductTitle": null, "CommentId": 77, "Logo": "http://www.domain.com/Commercial/User/302/Logo/tmpF0BF.jpg", "Datum": 24.302.057, "AnswerDate": -2123661683, " AnswerEdit ": false, "CommentEdit": false, "ForfeitCount": 0, "RewardCount": 0, "ThisCountReport": 2, "Berichtet": [{ "$ id": "4" ist, "BlockerId": 355, "Titel": "محتوای غیر اخلایی", "Datum": -19527396, "ForfeitCount": 0, "RewardCount": 0 }, { "$ id": "5", "BlockerId": 355, "Titel": "محتوای غیر مرتبط", "Datum": -19527382, "ForfeitCount" : 0, "RewardCount": 0 }], "Gem": 0 }, { "$ id": "6", "UserId": 302, "UID": "302_UID", "Titel": "شیشیکک", "Absender": "شیشیکک", "Antwort": "", "Kommentar": "Test 2", "ProductTitle": null, "CommentId": 77, "Logo": "http://www.www.domain.com/Commercial/User/302/Logo/tmpF0BF.jpg", "Datum": 24.302.057, "AnswerDate": -2123661683, "AnswerEdit": false, "CommentEdit": false

 }] 

    }, 
    "StatusCode": "Created", 
    "Description": null 
} 

und ich diesen Schritt, aber es passiert nichts

JObject json1 = JObject.Parse(strMyJson); 
      _CommentAdmindto flight = Newtonsoft.Json.JsonConvert.DeserializeObject<_CommentAdmindto>(json1.ToString()); 
      _CommentAdmindto deserializedProduct = JsonConvert.DeserializeObject<_CommentAdmindto>(json); 
      _CommentAdmindto deserializedProduct1 = ConvertJsonToClass<_CommentAdmindto>(strMyJson); 
      JsonSerializer serializer = new JsonSerializer(); 
      _CommentAdmindto p = (_CommentAdmindto)serializer.Deserialize(new JTokenReader(strMyJson), typeof(_CommentAdmindto)); 

und hier ist meine Klasse und Funktion:

public static T ConvertJsonToClass<T>(string json) 
     { 
      System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
      return serializer.Deserialize<T>(json); 
     } 

    } 



    public class _CommentAdmindto 
    { 
     public long dateTime { get; set; } 

     public IQueryable<CommentDtoAdmin> list { get; set; } 


    } 


    public class CommentDtoAdmin 
    { 
     public long UserId { get; set; } 
     public string UID { get; set; } 
     public string Title { get; set; } 
     public string Sender { get; set; } 
     public string Answer { get; set; } 
     public string Comment { get; set; } 

     public string ProductTitle { get; set; } 
     public long CommentId { get; set; } 

     public string Logo { get; set; } 
     public long Date { get; set; } 

     public long AnswerDate { get; set; } 

     public bool AnswerEdit { get; set; } 

     public bool CommentEdit { get; set; } 


    } 
+0

Ich nehme an, es ist eine doppelte Frage http://Stackoverflow.com/questions/4718888/how-to-convert-json-to-c-sharp-classes –

+0

@HussainPatel auf Ihrem Link, sie haben es nicht hinzugefügt Klasse, einen Blick auf sie haben, bitte – Dav

+0

Ihre json nicht mit Ihrem Modell –

Antwort

4

Ihr Modell sollte ähnlich sein (für ungültig C# Namen, Sie JsonProperty Attribut verwenden können):

public class Reported 
{ 
    [JsonProperty("$id")] 
    public string id { get; set; } 
    public int BlockerId { get; set; } 
    public string Title { get; set; } 
    public int Date { get; set; } 
    public int ForfeitCount { get; set; } 
    public int RewardCount { get; set; } 
} 

public class List 
{ 
    [JsonProperty("$id")] 
    public string id { get; set; } 
    public int UserId { get; set; } 
    public string UID { get; set; } 
    public string Title { get; set; } 
    public string Sender { get; set; } 
    public string Answer { get; set; } 
    public string Comment { get; set; } 
    public object ProductTitle { get; set; } 
    public int CommentId { get; set; } 
    public string Logo { get; set; } 
    public int Date { get; set; } 
    public int AnswerDate { get; set; } 
    public bool AnswerEdit { get; set; } 
    public bool CommentEdit { get; set; } 
    public int ForfeitCount { get; set; } 
    public int RewardCount { get; set; } 
    public int ThisCountReport { get; set; } 
    public List<Reported> Reported { get; set; } 
    public int Gem { get; set; } 
} 

public class Result 
{ 
    [JsonProperty("$id")] 
    public string id { get; set; } 
    public int dateTime { get; set; } 
    public List<List> list { get; set; } 
} 

public class RootObject 
{ 
    [JsonProperty("$id")] 
    public string id { get; set; } 
    public Result Result { get; set; } 
    public string StatusCode { get; set; } 
    public object Description { get; set; } 
} 

Jetzt können Sie deserialisieren als

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

BTW: http://json2csharp.com/ helfen kann, zu erraten, Ihr Modell bei der Arbeit mit JSON.

+0

Wenn Sie Visual Studio 2015 verwenden, ist es zu einem in JSON-to-Class-Funktion eingebaut. Öffnen Sie einfach eine neue leere Klassendatei und Bearbeiten> Inhalte einfügen> JSON als Klassen. Funktioniert auch mit XML. Nicht immer perfekt, aber ziemlich gut.Das einzige, was es in diesem Fall vermisste, war die Attributdekoration auf den ID-Variablen. – PMV

+0

Vielen Dank :) – Dav

0

Ich denke, dass Sie JSON String nicht korrekte Syntax haben. Es sieht aus wie ein ']' (Ende von Array) und ein abschließendes '}' fehlt.

Das ist, was das Visual Studio Editor mir gesagt, wenn nach dem Entfernen all ‚\‘ eine JSON-Datei aus Ihrem String macht

+0

passend, die nicht die Antwort ist - Sie, dass in Kommentar setzen sollte, wenn Fall etwas falsch mit Frage –

+0

ich es bearbeiten, arbeitet json jetzt in Ordnung, aber ich kann nicht was ich – Dav

1

Sie scheinen in vielen verschiedenen Möglichkeiten, zu versuchen, deserialisieren, aber sie tun nicht haben eine vollständige Struktur, um tatsächlich den JSON zu entsprechen. Sie vermissen die äußere Klasse (die das vollständige Objekt darstellt) und mindestens Newtonsoft.Json kann nicht zu einem IQueryable deserialisieren, also änderte ich das zu IEnumerable.

string strMyJson = "{\"$id\":\"1\",\"Result\":{\"$id\":\"2\",\"dateTime\":23826985,\"list\":[{\"$id\":\"3\",\"UserId\":302,\"UID\":\"302_UID\",\"Title\":\"شیدکو\",\"Sender\":\"شیدکو\",\"Answer\":\"\",\"Comment\":\"test 2\",\"ProductTitle\":null,\"CommentId\":77,\"Logo\":\"http://www.domain.com/Commercial/User/302/Logo/tmpF0BF.jpg\",\"Date\":24307078,\"AnswerDate\":-2123656662,\"AnswerEdit\":false,\"CommentEdit\":false,\"ForfeitCount\":0,\"RewardCount\":0,\"ThisCountReport\":2,\"Reported\":[{\"$id\":\"4\",\"BlockerId\":355,\"Title\":\"محتوای غیر اخلاقی\",\"Date\":-19527396,\"ForfeitCount\":0,\"RewardCount\":0},{\"$id\":\"5\",\"BlockerId\":355,\"Title\":\"محتوای غیر مرتبط\",\"Date\":-19527382,\"ForfeitCount\":0,\"RewardCount\":0}],\"Gem\":0},{\"$id\":\"6\",\"UserId\":302,\"UID\":\"302_UID\",\"Title\":\"شیدکو\",\"Sender\":\"شیدکو\",\"Answer\":\"\",\"Comment\":\"test 2\",\"ProductTitle\":null,\"CommentId\":77,\"Logo\":\"http://www.domain.com/Commercial/User/302/Logo/tmpF0BF.jpg\",\"Date\":24307078,\"AnswerDate\":-2123656662,\"AnswerEdit\":false,\"CommentEdit\":false}],\"StatusCode\":\"Created\",\"Description\":null}}"; 


var result = JsonConvert.DeserializeObject<Wrapper>(strMyJson); 

mit Klassen wie folgt aussehen:

public class Wrapper 
{ 
    public _CommentAdmindto Result { get; set; } 
} 
public class _CommentAdmindto 
{ 
    public long dateTime { get; set; } 

    public IEnumerable<CommentDtoAdmin> list { get; set; } 
} 

CommentDtoAdmin sucht das gleiche. Obwohl ich sagen muss, dass dir das nur bei der Deserialisierung hilft.

+0

Dank gefragt, dann ist es wirklich besser, aber ich habe jetzt einen anderen Fehler, in System.Web.Extensions.dll Arbeits ereignete sich am neuen error.An Ausnahme des Typs ‚System.ArgumentException‘ wurde aber nicht Weitere in Benutzercode behandelt Information: Objekt vom Typ 'System.Collections.Generic.List'1 [AdminApp._CommentReported]' ca nnicht in den Typ 'System.Linq.IQueryable'1 [AdminApp._CommentReported]' konvertiert werden. – Dav

1

Erstens sind die $id" Eigenschaften sind synthetische Eigenschaften durch Json.NET hinzugefügt mehrere Verweise auf das gleiche Objekt zu verfolgen und zu erhalten. Einzelheiten finden Sie unter PreserveReferencesHandling setting.

Wenn Sie also die "$id" Eigenschaften vorübergehend entfernen, können Sie Ihre JSON http://json2csharp.com/ laden und die folgende Datenmodell erhalten:

public class Reported 
{ 
    public int BlockerId { get; set; } 
    public string Title { get; set; } 
    public int Date { get; set; } 
    public int ForfeitCount { get; set; } 
    public int RewardCount { get; set; } 
} 

public class CommentDtoAdmin 
{ 
    public int UserId { get; set; } 
    public string UID { get; set; } 
    public string Title { get; set; } 
    public string Sender { get; set; } 
    public string Answer { get; set; } 
    public string Comment { get; set; } 
    public object ProductTitle { get; set; } 
    public int CommentId { get; set; } 
    public string Logo { get; set; } 
    public int Date { get; set; } 
    public int AnswerDate { get; set; } 
    public bool AnswerEdit { get; set; } 
    public bool CommentEdit { get; set; } 
    public int ForfeitCount { get; set; } 
    public int RewardCount { get; set; } 
    public int ThisCountReport { get; set; } 
    public List<Reported> Reported { get; set; } 
    public int Gem { get; set; } 
} 

public class Result 
{ 
    public int dateTime { get; set; } 
    public List<CommentDtoAdmin> list { get; set; } 
} 

public class RootObject 
{ 
    public Result Result { get; set; } 
    public string StatusCode { get; set; } 
    public string Description { get; set; } 
} 

Ich änderte dann das zurückgegebene Modell wie folgt:

  • ich benutzte den Namen CommentDtoAdmin für den list Typ.
  • habe ich die Art der Description Eigenschaft string.

nun Ihre JSON kann wie folgt deserialisiert und Wieder serialisiert werden:

var settings = new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
}; 
var root = JsonConvert.DeserializeObject<RootObject>(json1, settings); 

var json2 = JsonConvert.SerializeObject(root, Formatting.Indented, settings); 

Beachten Sie, dass Json.NET hat keine eingebaute Logik für Deserialisieren die Schnittstelle IQueryable<T> auf einen konkreten Typ, also musste ich um die Eigenschaft als public List<CommentDtoAdmin> list { get; set; } zu verlassen. Sie können immer einen abfragbaren aus der Liste erzeugen mit AsQueryable():

var queryable = root.Result.list.AsQueryable(); 

Probe fiddle.