6

我真的很难在 C# 中找到任何 JSON 反序列化示例,其中每个 JSON 项中的第一个属性是不同的 ID。

    {
       "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"      
           }
    }

我尝试了几种不同的方法都没有成功。返回的我无法控制的 JSON 有时是单个项目,有时是一组项目,如上面的示例。理想情况下,如果可能的话,我想反序列化为一个类型化的对象类。

谢谢

谢谢 LB

我已经尝试通过以下字符串提供的代码示例

    '{"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<br/><br/>Error Signature:<br/>Exception: EXC_CRASH (SIGTRAP)<br/>Date/Time: 2012-10-06 17:59:38 +0000<br/>Application Name: Microsoft Outlook<br/>Application Bundle ID: com.microsoft.Outlook<br/>Application Signature: OPIM<br/>Application Version: 14.2.4.120824<br/>Crashed Module Name: merp<br/>Crashed Module Version: 2.2.4.120824<br/>Crashed Module Offset: 0x00003aa2<br/>Blame Module Name: Microsoft Outlook<br/>Blame Module Version: 14.2.4.120824<br/>Blame Module Offset: 0x003c900c<br/>Application LCID: 1033<br/>Extra app info: Reg=en Loc=0x0409<br/>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"}}'

我收到“InvalidCastException”,无法将“System.String”类型的对象转换为“Newtonsoft.Json.Linq.JObject”类型。

我尝试从字符串的开头和结尾删除单引号但得到相同的消息?

4

3 回答 3

10

使用Json.Net

(发布的 JSON 无效。将 invalid s替换为,以下工作。)\u005C"\u005C

string 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<br/><br/>Error Signature:<br/>Exception: EXC_CRASH (SIGTRAP)<br/>Date/Time: 2012-10-06 17:59:38 +0000<br/>Application Name: Microsoft Outlook<br/>Application Bundle ID: com.microsoft.Outlook<br/>Application Signature: OPIM<br/>Application Version: 14.2.4.120824<br/>Crashed Module Name: merp<br/>Crashed Module Version: 2.2.4.120824<br/>Crashed Module Offset: 0x00003aa2<br/>Blame Module Name: Microsoft Outlook<br/>Blame Module Version: 14.2.4.120824<br/>Blame Module Offset: 0x003c900c<br/>Application LCID: 1033<br/>Extra app info: Reg=en Loc=0x0409<br/>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<JProperty>()
    .Select(j=>new
    {
        ID=j.Name,
        Topic = (string)j.Value["Topic_ID"],
        Moved = (string)j.Value["Moved_ID"],
        Subject = (string)j.Value["subject"],
    })
    .ToList();
于 2012-10-06T19:29:45.990 回答
2

使用 System.Web,我有一个小方法似乎适用于每个使用 JSON 进行数据存储的项目:

private T UnpackJson<T>(object data)
{
    var serializer = new JavaScriptSerializer();
    string rawJSON = serializer.Serialize(data);

    var result = serializer.Deserialize<T>(rawJSON);
    return result;
}

...其中 T 是某种类型,其元素与您要反序列化的架构匹配。对于顶部给出的 blob,我建议如下:

// Using my above method...
var x = UnpackJson<Foo[]>(blob);

public class Foo
{
    public string ID;
    public Bar SubItem;
}

public class Bar
{
    public int Topic_ID;
    public int Subject_ID;
    public string subject; 
}

...请注意,您的变量名称应与 JSON blob 中的属性名称完全匹配!我当然希望这可行(请注意,虽然我使用该方法并确定它将反序列化一个 blob 到一个类,但此实现未经测试。)

于 2013-02-04T17:37:22.767 回答
0

使用JSON.NET - 用于 .NET 的免费 JSON 解析器/序列化器。

于 2012-10-06T19:25:19.947 回答