繁体   English   中英

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

[英]Deserialize json string to object c#.net

我有一个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 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);

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

您的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_amountdiscountdouble值-确实不适合货币值。 不幸的是,您可能无法控制它。

是的,正如@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}";

我认为乔恩的答案要确定得多。

您的JSON是Dictionary<string,trn> ,请在此小提琴中尝试一下

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; }
    }


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM