Perché JsonConvert.DeserializeObject non funziona?

Ho un risultato dal servizio web, la stringa di risultati :

{"status":"success","data":{"address":"[email protected]","unconfirmed":[{"tx":"cb2f252078d933f63d9cef52bee8857427d70c1142f41f10567cfad7ef1d2dcb","time_utc":"2015-03-31T19:05:09Z","amount":0.1,"n":0},{"tx":"a34fc5b8b3c29c7046ca8acaedd39280f81597a853f30825856e2f46e498c478","time_utc":"2015-03-31T19:05:01Z","amount":0.1,"n":0}]},"code":200,"message":""}

Sto chiamando JsonConvert.DeserializeObject:

UTByAddressessResponse dati = Serializzatore.Deserialize(risultato);

public static T Deserialize<T>(string json)
        {
            return JsonConvert.DeserializeObject<T>(json);
        }




public class UTByAddressessResponse
    {
        public string status { get; set; }
        public UnconfirmedAddressInfo[] data { get; set; }

        public string code { get; set; }
        public string message { get; set; }
    }


public class UnconfirmedAddressInfo
    {
        public string address { get; set; }
        public List<UT> unconfirmed { get; set; }
    }



public class UT
    {
        public string tx { get; set; }
        public DateTime time_utc { get; set; }
        public float amount { get; set; }
        public long n { get; set; }
    }

Ma continuo a ricevere un errore :

Non deserializzare l’attuale oggetto JSON (ad esempio {“nome”:”valore”})
in ” tipo di Dadi.Comune.Oggetti.UnconfirmedAddressInfo []’, perché il
tipo richiede un array JSON (ad esempio, [1,2,3]) per deserializzare correttamente.

Perché ?



2 Replies
  1. 3

    Incollare il json per http://json2csharp.com/ creerà le seguenti classi

    public class Unconfirmed
    {
        public string tx { get; set; }
        public string time_utc { get; set; }
        public double amount { get; set; }
        public int n { get; set; }
    }
    
    public class Data
    {
        public string address { get; set; }
        public List<Unconfirmed> unconfirmed { get; set; }
    }
    
    public class RootObject
    {
        public string status { get; set; }
        public Data data { get; set; }
        public int code { get; set; }
        public string message { get; set; }
    }

    Ora è possibile deserializzare come

    var obj = JsonConvert.DeserializeObject<RootObject>(json_string);

    PS: È possibile rinominare i nomi di classe, ma se si desidera rinominare proprietà, si dovrebbe utilizzare JsonProperty attributo.

  2. 1

    Il problema è che

    public class UTByAddressessResponse
        {
            public string status { get; set; }
            public UnconfirmedAddressInfo[] data { get; set; }
    
            public string code { get; set; }
            public string message { get; set; }
        }

    dovrebbe essere

    public class UTByAddressessResponse
        {
            public string status { get; set; }
            public UnconfirmedAddressInfo data { get; set; } //not array
    
            public string code { get; set; }
            public string message { get; set; }
        }

Lascia un commento