使用JSON.net反序列化对象

时间:2014-09-15 13:11:47

标签: c# json.net

我无法使用JSON.net将JSON字符串反序列化为对象。

我用以下方法调用序列化:

Payload payload = JsonConvert.DeserializeObject<Payload>(string);

但是,生成的Payload对象为null。有什么想法吗?

我的课程:

public class Payload
{
    public Payload()
    { }

    public string Action { get; set; }
    public Payload.Bill[] Bills { get; set; }
    public string ResourceType { get; set; }
    public string Signature { get; set; }

    public class Bill
    {
        public Bill()
        { }

        public string Amount { get; set; }

        public string Id { get; set; }
        public string MerchantId { get; set; }
        public DateTimeOffset? PaidAt { get; set; }
        public string SourceId { get; set; }
        public string SourceType { get; set; }
        public string Status { get; set; }
        public string Uri { get; set; }
        public string UserId { get; set; }
    }
}

我的JSON字符串:

{
  "payload": {
    "bills": [
      {
        "id": "xxxx",
        "status": "withdrawn",
        "uri": "xxxx",
        "amount": "5.19",
        "amount_minus_fees": "5.14",
        "source_type": "subscription",
        "source_id": "xxx",
        "payout_id": "xxx"
      }
    ],
    "resource_type": "bill",
    "action": "withdrawn",
    "signature": "xxx"
  }
}

2 个答案:

答案 0 :(得分:3)

生成的有效内容对象为null,因为json字符串结构与您的Payload类不匹配。您需要其他包装类才能成功反序列化:

public class PayloadWrapper
{
    public PayloadWrapper()
    {
        Payload = new Payload();
    }

    public Payload Payload { get; set; }
}

和反序列化逻辑:

PayloadWrapper wrap = JsonConvert.DeserializeObject<PayloadWrapper>(jsonStr);

为避免创建另一个包装类,可以使用LINQ to JSON:

JObject obj = JObject.Parse(jsonStr);
Payload payload = obj["payload"].ToObject<Payload>();

其中jsonStr变量是您发布的json字符串。另外我注意到json字符串中的某些属性与Payload类的属性名称不匹配,例如json字符串中的resource_type和类中的ResourceType。为它们添加JsonProperty属性以便成功反序列化。

答案 1 :(得分:-1)

尝试下面的一个 DeserializeObject的类型参数必须是List<Payload>而不是字符串。它将是JsonConvert.DeserializeObject<List<Payload>>(json)