2016-06-26 40 views
-1

Ich versuche, JSON in ein Objekt "MarginBalance" zu deserialisieren. Wenn ich versuche, dieses JSON zu deserialisieren:C# .NET JSON-Zeichenfolge zu Objekt deserialisieren

{"totalValue":"0.00091979","pl":"0.00000000","lendingFees":"0.00000000","netValue":"0.00091979","totalBorrowedValue":"0.00000000","currentMargin":"1.00000000"} 

zu diesem Objekt:

public class MarginBalance : IMarginBalance 
{ 
    [JsonProperty("totalValue")] 
    public double TotalValue { get; set; } 

    [JsonProperty("pl")] 
    public double PL { get; set; } 

    [JsonProperty("lendingFees")] 
    public double LendingFees { get; set; } 

    [JsonProperty("netValue")] 
    public double NetValue { get; set; } 

    [JsonProperty("totalBorrowedValue")] 
    public double TotalBorrowedValue { get; set; } 

    [JsonProperty("currentMargin")] 
    public double CurrentMargin { get; set; } 
} 

Umsetzung dieser Schnittstelle:

public interface IMarginBalance 
{ 
    double TotalValue { get; } 
    double PL { get; } 
    double LendingFees { get; } 
    double NetValue { get; } 
    double TotalBorrowedValue { get; } 
    double CurrentMargin { get; } 
} 

es gibt null zurück. Hier ist mein Deserialisierungscode:

var postData = new Dictionary<string, object>(); 
var data = PostData<IDictionary<string, MarginBalance>>("returnMarginAccountSummary", postData); 
if (data != null) 
{ 
    // never reaches here 
    var returnData = new Dictionary<string, IMarginBalance>(); 
    foreach (string key in data.Keys) 
    { 
     returnData.Add(key, data[key]); 
    } 
    return returnData; 
} 

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
private T PostData<T>(string command, Dictionary<string, object> postData) 
{ 
    return ApiWebClient.PostData<T>(command, postData); 
} 

public T PostData<T>(string command, Dictionary<string, object> postData) 
{ 
    postData.Add("command", command); 
    postData.Add("nonce", Helper.GetCurrentHttpPostNonce()); 

    var jsonString = PostString(Helper.ApiUrlHttpsRelativeTrading, postData.ToHttpPostString()); 
    var output = JsonSerializer.DeserializeObject<T>(jsonString); 

    return output; 
} 

Hoffentlich kann jemand es erarbeiten! Ich habe den ganzen Tag versucht ... Danke im Voraus.

+0

Zeigen Sie uns mehr Code. Wie machen Sie die Deserialisierung? – dotctor

+0

@dotctor ich habe meine Frage aktualisiert – Nickmccomb

+0

ändern 'JsonSerializer.DeserializeObject' zu' JsonConvert.DeserializeObject' – dotctor

Antwort

1

Die Zahlen im Json sind von Apostrophen umgeben, was bedeutet, dass sie Strings sind, keine Zahlen. Sie können versuchen, die Apostrophe entweder aus den Zahlen in der JSON-Zeichenfolge zu entfernen, oder die Feldtypen in Form einer doppelten Zeichenfolge in dem Objekt zu ändern.

Die JsonProperty Attribute, die Sie in MarginBalance verwendet haben, gehören zu Newtonsoft.Json.Serialization Namensraum. Um das Objekt zu deserialisieren, verwenden Sie JsonConvert.DeserializeObject<MarginBalance>(jsonString)

+0

Ich habe das versucht und erhalten Eine Ausnahme vom Typ 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll aufgetreten, wurde aber nicht im Benutzercode behandelt Weitere Informationen: Fehler beim Konvertieren von Wert "0,00091977", um "Jojatekok.PoloniexAPI.WalletTools.MarginBalance" einzugeben. Pfad 'totalValue', Zeile 1, Position 26. – Nickmccomb

+1

@Nickmccomb Sie deserialisieren immer noch als 'IDictionary '. Tun Sie das nicht, wenn Sie nur eine einzige "MarginBalance" haben. – hvd

+0

Die Zahlen im Json sind von Apostrophen umgeben, was bedeutet, dass sie Strings sind, keine Zahlen. Sie können versuchen, die Apostrophe entweder aus den Zahlen in der JSON-Zeichenfolge zu entfernen, oder die Feldtypen in Form einer doppelten Zeichenfolge in dem Objekt zu ändern. –