如何调试不工作的JSON解析?

时间:2013-02-08 22:21:31

标签: c# json parsing

这是this one后续问题。我问如何解析,我得到了答案。话虽如此,我仍然没有让它工作,但可能不是因为答案不够。

我想调试不当行为,但我坦率地不知道如何。

这是我的反序列化代码。

DataContractJsonSerializer serializer 
  = new DataContractJsonSerializer(typeof(Customer));
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(textToParse));
Envelope customer = (Customer)serializer.ReadObject(stream);

return "Status = " + customer.Status + " and guid = " + customer.Guid

这是我使用的数据合约。

[DataContract]
public class Customer
{
  [DataMember(Name = "Status")]
  public int Status;

  [DataMember(Name = "CustomerId")]
  public String Guid;

  [DataMember(Name = "Information")]
  public Object Info;
}

这是要解析的文本的头部。

{"CustomerStatuses":[{
  "Information":[{"Guid":"1","Role":"Customer"}],
  "CustomerId":"12345678-1234-1324-1234-123456781234",
  "Status":"4"},
  "Information":[{"Guid":"5","Role":"Customer"}],
  "CustomerId":"12345678-1234-1324-1234-123456781234",
  "Status":"6"},
  "Information":[{"Guid":"7","Role":"Seller"}],
  "CustomerId":"12345678-1234-1324-1234-123456781234",
  "Status":"6"},
  ...

问题是属性 Status 为0, Guid 为null或空字符串。我只是没打他们。这里有什么问题,我该如何调试呢?

1 个答案:

答案 0 :(得分:0)

你的目标是错误的部分,或咆哮错误的标签,可以这么说。您不应该尝试解析 Customer ,而是 CustomerStatuses ,因为那是您的根对象。您 还需要一个课程。希望您的客户能够接受。

这是数据合同的代码。我已经包含了字段 Info ,因为它看起来像你需要它,但是随着规范的发展,你也可以省略它。

[DataContract]  
public class CustomerStatuses
{
  [DataMember(Name = "CustomerStatuses")]
  public IEnumerate<Customer> Customers;
}

[DataContract]
public class Customer
{
  [DataMember(Name = "Status")]
  public int Status;

  [DataMember(Name = "CustomerId")]
  public String Guid;

  [DataMember(Name = "Information")]
  public Object Info;
}

然后,您可以通过此代码访问这些内容。

DataContractJsonSerializer serializer 
  = new DataContractJsonSerializer(typeof(CustomerStatuses));
MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(jsonText));
CustomerStatuses parser = (CustomerStatuses)serializer.ReadObject(stream);

String guid = parser.DocumentStatuses.FirstOrDefault().Guid;
int status = parser.DocumentStatuses.FirstOrDefault().Status;

明天这肯定会出现在我的博客上!