0

DataContractJsonSerializerを使用してJSON文字列をクラスに変換しますが、常に空のオブジェクトを返します。 メモ帳で 'JSON Viewer'拡張子を持つ文字列をテストしましたが有効です。長い間バグを探して、他の例を比較しました。DataContractJsonSerializerが機能しない

これは短縮形で私のJSON文字列です:

{ 
"error":[], 
"result": { 
     "BCH": {"aclass":"currency","altname":"BCH","decimals":10,"display_decimals":5}, 
     "DASH": {"aclass":"currency","altname":"test"} 
    } 
} 

クラスGetAssetInfoResponseAssetInfoデータメンバー属性を持つプロパティが含まれていますが、プロパティ結果(逆シリアル化後)が含まれていません任意のオブジェクト。

[DataContract] 
[KnownType(typeof(AssetInfo))] 
public class GetAssetInfoResponse 
{ 
    [DataMember(Name = "error")] 
    public List<string> Error { get; set; } 

    [DataMember(Name = "result")] 
    public List<Dictionary<string, AssetInfo>> Result { get; set; } 
} 

[DataContract] 
public class AssetInfo 
{ 
    /// <summary> 
    /// Alternate name. 
    /// </summary> 
    [DataMember(Name = "altname")] 
    public string Altname { get; set; } 

    /// <summary> 
    /// Asset class. 
    /// </summary> 
    [DataMember(Name = "aclass")] 
    public string Aclass { get; set; } 

    /// <summary> 
    /// Scaling decimal places for record keeping. 
    /// </summary> 
    [DataMember(Name = "decimals")] 
    public int Decimals { get; set; } 

    /// <summary> 
    /// Scaling decimal places for output display. 
    /// </summary> 
    [DataMember(Name = "display_decimals")] 
    public int DisplayDecimals { get; set; } 
} 

これは私のテストコードです:

 var stream = new MemoryStream(Encoding.Unicode.GetBytes(strName)) 
     { 
      Position = 0 
     }; 
     var serializer = new DataContractJsonSerializer(typeof(GetAssetInfoResponse)); 
     GetAssetInfoResponse test = (GetAssetInfoResponse)serializer.ReadObject(stream); 

     Console.ReadLine(); 

プロジェクトは、任意の外部依存関係を含めるべきではありませんので、私はNewtonsoft.Json拡張子を使用することはできません。 JSON文字列をクラスに転送する別の方法はありますか?

あなたはList<Dictionary<string, AssetInfo>>としてResultを宣言したが、それは{で始まるので、フォーマットから、それは辞書の辞書ではなく、リスト(のように見えるあなたの時間

答えて

1

いただきありがとうございます、これは、オブジェクト、または辞書のために使用されています配列/リストに使用される[ではありません)。辞書のために、このフォーマットを使用するには、この設定とこの変更によりUseSimpleDictionaryFormatプロパティ

var serializer = new DataContractJsonSerializer(typeof(GetAssetInfoResponse), new DataContractJsonSerializerSettings 
{ 
    UseSimpleDictionaryFormat = true 
}); 

を設定する必要があり、それが働いた:

public Dictionary<string, AssetInfo> Result { get; set; } 
+0

ありがとうございました!今それは動作します。 – patbec

関連する問題