У меня есть строка 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);
но все свойства инициализируются нулевыми значениями.
Ваш 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
значения, которые действительно не подходят для значений валюты. К сожалению, вы не сможете это контролировать.
Ваш 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; }
}
}
Да, как говорит @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}";
Я думаю, что ответ Джона гораздо более определен.