Десериализовать строку json в объект c # .net

1

У меня есть строка 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 ответа

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 по-прежнему будут использоваться соответствующим образом. Я также изменил типы Transaction и VisitedDate. Наконец, это немного тревожит, что total_amount и discount - это double значения, которые действительно не подходят для значений валюты. К сожалению, вы не сможете это контролировать.

1

Ваш 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; }
    }


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

Я думаю, что ответ Джона гораздо более определен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню