使用DataContractJsonSerializer反序列化多部分JSON

问题描述:

我对JSON的精彩程度相当陌生 - 我使用的是DataContractJsonSerializer。我无法将Customer对象的多个实例获取到列表中。使用DataContractJsonSerializer反序列化多部分JSON

属性按预期工作,但我的列表中没有Customer对象。

{ 
    "@attributes": 
     {"count":"2", 
     "offset":"0", 
     "limit":"100" 
     }, 
    "Customer": 
     { 
      "firstName":"cust ", 
      "lastName":"one", 
      "title":"Owner", 
      "company":"CustOne Plants", 
      "companyRegistrationNumber":"", 
      "vatNumber":"", 
      "creditAccountID":"1", 
      "customerTypeID":"4", 
      "discountID":"0", 
      "taxCategoryID":"0", 
      "customerID":"1", 
      "createTime":"2017-06-19T23:36:11+00:00", 
      "timeStamp":"2017-06-20T18:55:11+00:00", 
      "archived":"false" 
     } 
    "Customer": 
     { 
      "firstName":"cust ", 
      "lastName":"two", 
      "title":"Owner", 
      "company":"CustTwo House of Games", 
      "companyRegistrationNumber":"", 
      "vatNumber":"", 
      "creditAccountID":"1", 
      "customerTypeID":"4", 
      "discountID":"0", 
      "taxCategoryID":"0", 
      "customerID":"1", 
      "createTime":"2017-06-19T23:36:11+00:00", 
      "timeStamp":"2017-06-20T18:55:11+00:00", 
      "archived":"false" 
     } 
} 

.NET代码:

StreamReader stream = new StreamReader(@"C:\TMC Projects\PotteryManufacturing\CustomerJSON.txt"); 
string text = stream.ReadToEnd(); 
stream.Close(); 
byte[] byteArray = Encoding.UTF8.GetBytes(text); 
MemoryStream stream1 = new MemoryStream(byteArray); 

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(CustomersRoot)); 
var varInfo = serializer.ReadObject(stream1) as CustomersRoot; 
stream1.Close(); 

,最后我的课/数据的合同/数据成员:

[DataContract] 
public class CustomersRoot 
{ 
    private List<Customer> m_Customers; 

    public CustomersRoot() { this.Customer = new List<Customer>(); } 
    [DataMember(Name ="@attributes")] 
    public Attributes attrs { get; set; } 

    [DataMember(Name = "Customer")] 
    public List<Customer> Customer 
    { 
     get { return m_Customers; } 
     set { m_Customers = value; } 
    } 
} 
[DataContract] 
public class Customer 
{ 
    [DataMember(Name ="firstName")] 
    public string firstName { get; set; } 
    [DataMember(Name = "lastName")] 
    public string lastName { get; set; } 
    [DataMember(Name = "title")] 
    public string title { get; set; } 
    [DataMember(Name = "company")] 
    public string company { get; set; } 
    [DataMember(Name = "companyRegistrationNumber")] 
    public string companyRegistrationNumber { get; set; } 
    [DataMember(Name = "vatNumber")] 
    public string vatNumber { get; set; } 
    [DataMember(Name = "creditAccountID")] 
    public int creditAccountID { get; set; } 
    [DataMember(Name = "customerTypeID")] 
    public int customerTypeID { get; set; } 
    [DataMember(Name = "discountID")] 
    public int discountID { get; set; } 
    [DataMember(Name = "taxCategoryID")] 
    public int taxCategoryID { get; set; } 
    [DataMember(Name = "customerID")] 
    public int customerID { get; set; } 
    [DataMember(Name = "createTime")] 
    public string createTime { get; set; } 
    [DataMember(Name = "timeStamp")] 
    public string timeStamp { get; set; } 
    [DataMember(Name = "archived")] 
    public bool archived { get; set; } 
} 

[DataContract] 
public class Attributes 
{ 
    [DataMember(Name = "count")] 
    public int count { get; set; } 
    [DataMember(Name = "offset")] 
    public int offset { get; set; } 
    [DataMember(Name = "limit")] 
    public int limit { get; set; } 
} 
+0

我正在更新新代码,所以你都可以看到我在哪里 - 仍然没有工作,但我知道必须有一种方法。 –

+0

如果您阅读[JavaScriptSerializer类](https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v = vs.110).aspx)的文档,指出“Json.NET应该用于序列化和反序列化”。 – crashmstr

+0

哈哈 - 真的吗?这太可怕了!哦,幸运的是,这些相同的Web服务都有一个XML端点,并且对XML进行反序列化是很容易的! :) –

我想通了,这是怎么回事就在这里 - 呼叫有时会返回一个Customer对象数组(上面未正确格式化)或对象的单个实例。当Web服务返回单个Customer实例时,List代码不起作用。我将不得不检查如何处理这个问题。