在C#中反序列化多个JSON记录

时间:2017-10-25 08:59:29

标签: c# json

我有以下Json记录字符串:

{
   "records":[
      {
         "PK":"1_1_8",
         "ID":"8",
         "DeviceID":"1",
         "RootID":"1",
         "CustName":"test1",
         "CustSurname":"test2",
         "Address":"Nisou 1",
         "City":"",
         "ZipCode":"",
         "PhoneNumber":"45646",
         "HomePhoneNumber":"",
         "Email":"",
         "Notes":"",
         "Owner":"1",
         "LanguageID":"1",
         "LanguagePK":"",
         "DeletedFlag":"false",
         "created":"2017-10-25 10:15:00",
         "modified":"2017-10-25 09:35:43"
      },
      {
         "PK":"1_1_33",
         "ID":"33",
         "DeviceID":"1",
         "RootID":"1",
         "CustName":"",
         "CustSurname":"",
         "Address":"",
         "City":"",
         "ZipCode":"",
         "PhoneNumber":"",
         "HomePhoneNumber":"",
         "Email":"",
         "Notes":"",
         "Owner":null,
         "LanguageID":"0",
         "LanguagePK":"",
         "DeletedFlag":"true",
         "created":"2017-10-25 10:13:54",
         "modified":"2017-10-25 10:13:54"
      },
      {
         "PK":"1_1_16",
         "ID":"16",
         "DeviceID":"1",
         "RootID":"1",
         "CustName":"Theodosis",
         "CustSurname":"",
         "Address":"Dali",
         "City":"Nicosia",
         "ZipCode":"2540",
         "PhoneNumber":"45645",
         "HomePhoneNumber":"99123456",
         "Email":"theodosis@gmail.com",
         "Notes":"",
         "Owner":"",
         "LanguageID":"1",
         "LanguagePK":"",
         "DeletedFlag":"false",
         "created":"2017-10-25 09:36:22",
         "modified":"2017-10-25 09:36:22"
      }
   ]
}

我在C#中使用Xamarin PCL试图将此字符串解析为对象列表。

我有一个Customer课程:

public class Customer
{
    [PrimaryKey]
    public string PK { get; set; }
    public int DeviceID { get; set; }
    public int ID { get; set; }

    public string RootID{ get; set; }

    public string CustName { get; set; }
    public string CustSurname { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public string PhoneNumber { get; set; }
    public string HomePhoneNumber { get; set; }
    public string Email { get; set; }
    public string Notes { get; set; }
    public bool Owner { get; set; }

    public int LanguageID { get; set; }
    public string LanguagePK { get; set; }

    public bool DeletedFlag { get; set; }
    public DateTime created { get; set; }
    public DateTime modified { get; set; }
}

我还尝试了一个包含Customer个对象列表的容器类。

public class DataContainer
{
    public List<Customer> customers { get; set; }
}

我在网上看到了很多关于如何将其解析为列表或任何可行类型的例子,但似乎没有什么对我有效。

我尝试了以下内容(JsonResults保存了Json记录的字符串):

var observation = JsonConvert.DeserializeObject<DataContainer>(JsonResults);

从其他帖子中,我无法从我的代码中访问JavaScriptSerializer类,可能是因为我正在使用的Xamarin PCL框架。

任何想法都会非常受欢迎,因为我说我不介意我解析字符串的格式,只要它可行。

谢谢。

3 个答案:

答案 0 :(得分:0)

您提供的JSON字符串是一个JSON对象,它包含一个名为records的属性。 records属性为List<Customer>。您不能将给定字符串直接反序列化为您提供的DataContainer类,因为属性名称不匹配。

在您提供的类中称为customers

public class DataContainer {
    public List<Customer> customers { get; set; } //records
}

或者请查看一下高级映射的属性

[JsonProperty]

您提供的JSON格式为:

{"records":[{Customer},{Customer},{Customer}]}

Owner属性为"1"null""。因此,我建议将所有者重新定义为int?(可空)

答案 1 :(得分:0)

您必须对代码进行以下更改才能使其正常工作。

首先也是最重要的一点,你没有属性customers,你有records,所以要么重命名

public class DataContainer {
    public List<Customer> records { get; set; }
}

或添加JsonProperty属性

[JsonProperty(PropertyName = "records")]

其次,您的Owner在C#中是bool,在Json中是可空的intint?)。所以要么在C#类中更改它

public int?  Owner { get; set; }    

或写一个转换器(e.g. like here

[JsonConverter(typeof(NullableIntToBooleanConverter))]
public bool Owner { get; set; }

Here is a working .NetFiddle

答案 2 :(得分:-2)

您的字符串显示一个对象,其中包含名为 <script>$(document).ready(function(){$('#twitter-widget-0').load(function() {var css = '<style type="text/css"> body {background: white;}</style>';$('#twitter-widget-0').contents().find("head").append(css);}); }); 的属性,其中包含其他对象的列表。您的代码正在尝试将其反序列化为不具有此类属性的对象。

此外,字符串包含可能缺少或具有数值的属性records的对象。它绝对不是一个布尔。

您必须将所有者更改为:

Owner

要反序列化字符串,您需要一个具有public int? Owner { get; set; } 属性的对象:

records