[英]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属性名称仍可以适当使用。 我还更改了Transaction
和VisitedDate
的类型。 最后,有点令人震惊的是total_amount
和discount
是double
值-确实不适合货币值。 不幸的是,您可能无法控制它。
是的,正如@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.