将json字符串反序列化为对象c#.net

时间:2015-04-05 16:48:30

标签: c# .net json

我有一个需要反序列化为对象的JSON字符串。

这就是我的尝试:

班级:

public class trn
{
    public string visited_date { get; set; }
    public string party_code { get; set; }
    public string response { get; set; }
    public string response_type { get; set; }
    public string time_stamp { get; set; }
    public string trans_id { get; set; }
    public double total_amount { get; set; }
    public double discount { get; set; }
}

json string:

string json = "{\"trn\":{\"visited_date\":\"2015-04-05\",\"party_code\":\"8978a1bf-c88b-11e4-a815-00ff2dce0943\",\"response\":\"Reason 5\",\"response_type\":\"NoOrder\",\"time_stamp\":\"2015-04-05 18:27:42\",\"trans_id\":\"8e15f00b288a701e60a08f968a42a560\",\"total_amount\":0.0,\"discount\":0.0}}";

trn model2 = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<trn>(json);

并使用json.net

trn model = JsonConvert.DeserializeObject<trn>(json);

但所有属性都使用空值初始化。

3 个答案:

答案 0 :(得分:6)

您的JSON表示一个对象trn作为另一个对象中的属性。所以你需要在代码中表示它。例如:

using System;
using System.IO;
using Newtonsoft.Json;

public class Transaction
{
    [JsonProperty("visited_date")]
    public DateTime VisitedDate { get; set; }
    [JsonProperty("party_code")]
    public string PartyCode { get; set; }
    [JsonProperty("response")]
    public string Response { get; set; }
    [JsonProperty("response_type")]    
    public string ResponseType { get; set; }
    [JsonProperty("time_stamp")]
    public DateTime Timestamp { get; set; }
    [JsonProperty("trans_id")]
    public string TransactionId { get; set; }
    [JsonProperty("total_amount")]    
    public double TotalAmount { get; set; }
    [JsonProperty("discount")]
    public double Discount { get; set; }
}

public class TransactionWrapper
{
    [JsonProperty("trn")]
    public Transaction Transaction { get; set; }
}

class Test
{
    static void Main(string[] args)
    {
        string json = "{\"trn\":{\"visited_date\":\"2015-04-05\",\"party_code\":\"8978a1bf-c88b-11e4-a815-00ff2dce0943\",\"response\":\"Reason 5\",\"response_type\":\"NoOrder\",\"time_stamp\":\"2015-04-05 18:27:42\",\"trans_id\":\"8e15f00b288a701e60a08f968a42a560\",\"total_amount\":0.0,\"discount\":0.0}}";
        var wrapper = JsonConvert.DeserializeObject<TransactionWrapper>(json);
        Console.WriteLine(wrapper.Transaction.PartyCode);
    }
}

请注意我是如何使用[JsonProperty]属性来允许属性名称本身是.NET的惯用语,但仍然可以正确使用JSON属性名称。我还更改了TransactionVisitedDate的类型。最后,total_amountdiscount的值double略微令人担忧 - 它们确实不适合货币值。不幸的是,你可能无法控制它。

答案 1 :(得分:1)

是的,正如@InvernoMuto所说,你的JSON字符串是一个具有嵌套对象属性的对象,内部对象是trn对象。您的JSON字符串需要像这样才能工作:

string json = "{\"visited_date\":\"2015-04-05\",\"party_code\":\"8978a1bf-c88b-11e4-a815-00ff2dce0943\",\"response\":\"Reason 5\",\"response_type\":\"NoOrder\",\"time_stamp\":\"2015-04-05 18:27:42\",\"trans_id\":\"8e15f00b288a701e60a08f968a42a560\",\"total_amount\":0.0,\"discount\":0.0}";

我认为乔恩的答案更为确定。

答案 2 :(得分:1)

您的JSON是Dictionary<string,trn>,请尝试使用此Fiddle

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;



public class Program
{

    public static void Main()
    {
        string json = "{\"trn\":{\"visited_date\":\"2015-04-05\",\"party_code\":\"8978a1bf-c88b-11e4-a815-00ff2dce0943\",\"response\":\"Reason 5\",\"response_type\":\"NoOrder\",\"time_stamp\":\"2015-04-05 18:27:42\",\"trans_id\":\"8e15f00b288a701e60a08f968a42a560\",\"total_amount\":0.0,\"discount\":0.0}}";

        var p = JsonConvert.DeserializeObject<Dictionary<string,trn>>( json );



        Console.WriteLine(p["trn"].party_code);
    }
    public class trn
    {
        public string visited_date { get; set; }
        public string party_code { get; set; }
        public string response { get; set; }
        public string response_type { get; set; }
        public string time_stamp { get; set; }
        public string trans_id { get; set; }
        public double total_amount { get; set; }
        public double discount { get; set; }
    }


}