2016-06-26 4 views
-1

JSONをオブジェクト「MarginBalance」に逆シリアル化しようとしています。このオブジェクトにC#.NETオブジェクトにJSON文字列を逆シリアル化する

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

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

このインタフェースを実装する:私はこのJSONをデシリアライズしようとすると

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

それはnullを返します。ここに私の脱直列化コードがあります:

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

うまくいけば、誰かがそれを試してみてください!私は一日中努力しています...事前に感謝します。

+0

私たちにもっとコードを教えてください。どのようにデシリアライズを行うのですか? – dotctor

+0

@dotctor – Nickmccomb

+0

'JsonSerializer.DeserializeObject'を' JsonConvert.DeserializeObject'に変更する – dotctor

答えて

1

Jsonの数字はアポストロフィで囲まれています。つまり、数字ではなく文字列です。 Json文字列の数値からアポストロフィを削除するか、オブジェクトのdouble型のフィールド型を文字列に変更することができます。

MarginBalanceで使用したJsonPropertyの属性は、Newtonsoft.Json.Serialization名前空間に属しています。オブジェクトを非直列化するにはJsonConvert.DeserializeObject<MarginBalance>(jsonString)

+0

Newtonsoft.Json.dllで 'Newtonsoft.Json.JsonSerializationException'型の例外が発生しましたが、これを受け取りましたが、ユーザーコードで処理されませんでした 追加情報:値の変換中にエラーが発生しました"0.00091977"を入力して 'Jojatekok.PoloniexAPI.WalletTools.MarginBalance'と入力します。 Path 'totalValue'、1行目、26桁目。 – Nickmccomb

+1

@NickmccombあなたはまだIDictionary のようにdeserialisingしています。 1つの「MarginBalance」しか持っていないなら、それをしないでください。 – hvd

+0

Json内の数字はアポストロフィで囲まれています。つまり、数字ではなく文字列です。 Json文字列の数値からアポストロフィを削除するか、オブジェクトのdouble型のフィールド型を文字列に変更することができます。 –

関連する問題