Désérialisation de chaîne JSON en C #

J’ai vraiment du mal à trouver des exemples de désérialisation JSON en C # où la première propriété de chaque élément JSON est un ID différent.

{ "12112083":{ "Topic_ID":"12112083", "Moved_ID":"51", "subject":"subject text goes here" }, "12111966":{ "Topic_ID":"12111966", "Moved_ID":"51", "subject":"another subject text" }, "12106917":{ "Topic_ID":"12106917", "Moved_ID":"0", "subject":"test" } } 

J’ai essayé différentes méthodes sans succès. Le JSON renvoyé sur lequel je n’ai aucun contrôle est parfois un élément unique et parfois un tableau d’éléments comme dans l’exemple ci-dessus. Idéalement, j’aimerais désérialiser dans une classe d’objects typés, si possible.

Merci

Merci LB

J’ai essayé l’exemple de code fourni en passant la chaîne suivante

  '{"12112083":{"Topic_ID":"12112083","Moved_ID":"51","subject":"Due to a computer virus, many of my files are \u005C"Crypted\u005C",espe","Start_date":"10/6/2012 6:54:37 PM","InitialResponseDueDate":"10/6/2012 7:01:37 PM","Locked":"0","QValue":"$10","Status":"1","Author_ID":"71318191","Question_Text":"Due to a computer virus, many of my files are \u005C"Crypted\u005C",especially my pictures. Now my FinepixA500 camera will not upload photos to my computer (laptop). Geek Squad could not crack the code and suggested that I contact Toshiba and have them reset the computer to its original manufacturer settings. If I do that, I will lose all of my data. The only thing that appears not to be working is \u005C"photo gallery\u005C". (therefore, my camera will not upload photos anymore.....) Any suggestions?","Username":"JACUSTOMER-iei7o0tr-","No_of_Questions":"0","No_of_Accepts":"0","Last_visit":"10/6/2012 7:22:18 PM","Join_Date":"10/6/2012 6:46:29 PM","lastExpert":"","IsPress":"False","hasCustomerOptOuts":"0","RecCount":"0","OptedOut":"","Urgency":"51","AuthorHasSubscription":"False","Relisted":"0","IsAbandoned":"False","categoryName":"Camera and Video","categoryName_Additional":"Laptop","QuestionCommissionHasAdjusted":"False","LockedBy":"-1","IsOnline":"False","QuestionLink":"/video-camera-repair/77lqr-due-computer-virus-files-crypted-espe.html","WaitingForYou":"False","RequestedForYou":"False","IsChatEnabled":"False","ChangedKeyList":"","DeltaType":"A"},"12111966":{"Topic_ID":"12111966","Moved_ID":"51","subject":"office/outlook for mac 2011 keeps hanging upMicrosoft Error","Start_date":"10/6/2012 6:25:06 PM","InitialResponseDueDate":"10/6/2012 7:25:06 PM","Locked":"0","QValue":"$19","Status":"1","Author_ID":"71317792","Question_Text":"office/outlook for mac 2011 keeps hanging upMicrosoft Error Reporting log version: 2.0

Error Signature:
Exception: EXC_CRASH (SIGTRAP)
Date/Time: 2012-10-06 17:59:38 +0000
Application Name: Microsoft Outlook
Application Bundle ID: com.microsoft.Outlook
Application Signature: OPIM
Application Version: 14.2.4.120824
Crashed Module Name: merp
Crashed Module Version: 2.2.4.120824
Crashed Module Offset: 0x00003aa2
Blame Module Name: Microsoft Outlook
Blame Module Version: 14.2.4.120824
Blame Module Offset: 0x003c900c
Application LCID: 1033
Extra app info: Reg=en Loc=0x0409
Crashed thread: 10","Username":"JACUSTOMER-wr0d1qwb-","No_of_Questions":"0","No_of_Accepts":"0","Last_visit":"10/6/2012 6:54:53 PM","Join_Date":"10/6/2012 6:25:00 PM","lastExpert":"","IsPress":"False","hasCustomerOptOuts":"0","RecCount":"0","OptedOut":"","Urgency":"51","AuthorHasSubscription":"False","Relisted":"0","IsAbandoned":"False","categoryName":"Microsoft Office","categoryName_Additional":"","QuestionCommissionHasAdjusted":"False","LockedBy":"-1","IsOnline":"False","QuestionLink":"/microsoft-office/77lni-office-outlook-mac-2011-keeps-hanging-upmicrosoft-error.html","WaitingForYou":"False","RequestedForYou":"False","IsChatEnabled":"True","ChangedKeyList":"","DeltaType":"A"},"12106917":{"Topic_ID":"12106917","Moved_ID":"0","subject":"test","Start_date":"10/5/2012 6:22:42 PM","InitialResponseDueDate":"10/5/2012 6:40:42 PM","Locked":"0","QValue":"$21","Status":"1","Author_ID":"69617617","Question_Text":"test","Username":"JACUSTOMER-dwbsyao6-","No_of_Questions":"4","No_of_Accepts":"1","Last_visit":"10/6/2012 11:12:19 AM","Join_Date":"7/16/2012 12:59:47 PM","lastExpert":"","IsPress":"False","hasCustomerOptOuts":"0","RecCount":"0","OptedOut":"","Urgency":"0","AuthorHasSubscription":"True","Relisted":"0","IsAbandoned":"False","categoryName":"Computer","categoryName_Additional":"","QuestionCommissionHasAdjusted":"True","LockedBy":"-1","IsOnline":"True","QuestionLink":"/computer/77hr9-test.html","WaitingForYou":"False","RequestedForYou":"False","IsChatEnabled":"True","ChangedKeyList":"","DeltaType":"A"}}'

J’ai reçu “InvalidCastException”, impossible de convertir l’object de type “System.Ssortingng” en “Newtonsoft.Json.Linq.JObject”.

J’ai essayé de supprimer les guillemets simples au début et à la fin de la chaîne, mais j’ai reçu le même message?

Utiliser Json.Net

(Le fichier JSON publié n’est pas valide. Après le remplacement de \u005C" non valides par \u005C" \u005C .)

 ssortingng json = @"{""12112083"":{""Topic_ID"":""12112083"",""Moved_ID"":""51"",""subject"":""Due to a computer virus, many of my files are \u005CCrypted\u005C,espe"",""Start_date"":""10/6/2012 6:54:37 PM"",""InitialResponseDueDate"":""10/6/2012 7:01:37 PM"",""Locked"":""0"",""QValue"":""$10"",""Status"":""1"",""Author_ID"":""71318191"",""Question_Text"":""Due to a computer virus, many of my files are \u005CCrypted\u005C,especially my pictures. Now my FinepixA500 camera will not upload photos to my computer (laptop). Geek Squad could not crack the code and suggested that I contact Toshiba and have them reset the computer to its original manufacturer settings. If I do that, I will lose all of my data. The only thing that appears not to be working is \u005Cphoto gallery\u005C. (therefore, my camera will not upload photos anymore.....) Any suggestions?"",""Username"":""JACUSTOMER-iei7o0tr-"",""No_of_Questions"":""0"",""No_of_Accepts"":""0"",""Last_visit"":""10/6/2012 7:22:18 PM"",""Join_Date"":""10/6/2012 6:46:29 PM"",""lastExpert"":"""",""IsPress"":""False"",""hasCustomerOptOuts"":""0"",""RecCount"":""0"",""OptedOut"":"""",""Urgency"":""51"",""AuthorHasSubscription"":""False"",""Relisted"":""0"",""IsAbandoned"":""False"",""categoryName"":""Camera and Video"",""categoryName_Additional"":""Laptop"",""QuestionCommissionHasAdjusted"":""False"",""LockedBy"":""-1"",""IsOnline"":""False"",""QuestionLink"":""/video-camera-repair/77lqr-due-computer-virus-files-crypted-espe.html"",""WaitingForYou"":""False"",""RequestedForYou"":""False"",""IsChatEnabled"":""False"",""ChangedKeyList"":"""",""DeltaType"":""A""},""12111966"":{""Topic_ID"":""12111966"",""Moved_ID"":""51"",""subject"":""office/outlook for mac 2011 keeps hanging upMicrosoft Error"",""Start_date"":""10/6/2012 6:25:06 PM"",""InitialResponseDueDate"":""10/6/2012 7:25:06 PM"",""Locked"":""0"",""QValue"":""$19"",""Status"":""1"",""Author_ID"":""71317792"",""Question_Text"":""office/outlook for mac 2011 keeps hanging upMicrosoft Error Reporting log version: 2.0

Error Signature:
Exception: EXC_CRASH (SIGTRAP)
Date/Time: 2012-10-06 17:59:38 +0000
Application Name: Microsoft Outlook
Application Bundle ID: com.microsoft.Outlook
Application Signature: OPIM
Application Version: 14.2.4.120824
Crashed Module Name: merp
Crashed Module Version: 2.2.4.120824
Crashed Module Offset: 0x00003aa2
Blame Module Name: Microsoft Outlook
Blame Module Version: 14.2.4.120824
Blame Module Offset: 0x003c900c
Application LCID: 1033
Extra app info: Reg=en Loc=0x0409
Crashed thread: 10"",""Username"":""JACUSTOMER-wr0d1qwb-"",""No_of_Questions"":""0"",""No_of_Accepts"":""0"",""Last_visit"":""10/6/2012 6:54:53 PM"",""Join_Date"":""10/6/2012 6:25:00 PM"",""lastExpert"":"""",""IsPress"":""False"",""hasCustomerOptOuts"":""0"",""RecCount"":""0"",""OptedOut"":"""",""Urgency"":""51"",""AuthorHasSubscription"":""False"",""Relisted"":""0"",""IsAbandoned"":""False"",""categoryName"":""Microsoft Office"",""categoryName_Additional"":"""",""QuestionCommissionHasAdjusted"":""False"",""LockedBy"":""-1"",""IsOnline"":""False"",""QuestionLink"":""/microsoft-office/77lni-office-outlook-mac-2011-keeps-hanging-upmicrosoft-error.html"",""WaitingForYou"":""False"",""RequestedForYou"":""False"",""IsChatEnabled"":""True"",""ChangedKeyList"":"""",""DeltaType"":""A""},""12106917"":{""Topic_ID"":""12106917"",""Moved_ID"":""0"",""subject"":""test"",""Start_date"":""10/5/2012 6:22:42 PM"",""InitialResponseDueDate"":""10/5/2012 6:40:42 PM"",""Locked"":""0"",""QValue"":""$21"",""Status"":""1"",""Author_ID"":""69617617"",""Question_Text"":""test"",""Username"":""JACUSTOMER-dwbsyao6-"",""No_of_Questions"":""4"",""No_of_Accepts"":""1"",""Last_visit"":""10/6/2012 11:12:19 AM"",""Join_Date"":""7/16/2012 12:59:47 PM"",""lastExpert"":"""",""IsPress"":""False"",""hasCustomerOptOuts"":""0"",""RecCount"":""0"",""OptedOut"":"""",""Urgency"":""0"",""AuthorHasSubscription"":""True"",""Relisted"":""0"",""IsAbandoned"":""False"",""categoryName"":""Computer"",""categoryName_Additional"":"""",""QuestionCommissionHasAdjusted"":""True"",""LockedBy"":""-1"",""IsOnline"":""True"",""QuestionLink"":""/computer/77hr9-test.html"",""WaitingForYou"":""False"",""RequestedForYou"":""False"",""IsChatEnabled"":""True"",""ChangedKeyList"":"""",""DeltaType"":""A""}}"; var jobj = (JObject)JsonConvert.DeserializeObject(json); var items = jobj.Children() .Cast() .Select(j=>new { ID=j.Name, Topic = (ssortingng)j.Value["Topic_ID"], Moved = (ssortingng)j.Value["Moved_ID"], Subject = (ssortingng)j.Value["subject"], }) .ToList();

En utilisant System.Web, j’ai une petite méthode qui semble se retrouver dans tous les projets qui utilisent JSON pour le stockage de données:

 private T UnpackJson(object data) { var serializer = new JavaScriptSerializer(); ssortingng rawJSON = serializer.Serialize(data); var result = serializer.Deserialize(rawJSON); return result; } 

… Où T est un type avec des éléments qui correspondent au schéma que vous désérialisez. Pour votre blob qui est donné en haut, je suggérerais quelque chose comme:

 // Using my above method... var x = UnpackJson(blob); public class Foo { public ssortingng ID; public Bar SubItem; } public class Bar { public int Topic_ID; public int Subject_ID; public ssortingng subject; } 

… Notez que les noms de vos variables doivent correspondre totalement aux noms des atsortingbuts du blob JSON! J’espère certainement que cela fonctionnera (notez que bien que j’utilise la méthode et que je sache avec certitude qu’elle va désérialiser un blob dans une classe, cette implémentation n’a pas été testée.)

Utilisez l’parsingur / sérialiseur JSON gratuit pour .NET.