DataContractJsonSerializer无法正常工作

时间:2017-09-14 14:09:18

标签: c# json serialization datacontract datacontractjsonserializer

我使用 DataContractJsonSerializer 将JSON字符串转换为类,但始终返回一个空对象。 我在记事本中使用'JSON Viewer'扩展测试了该字符串,是有效的。长期搜索了一个bug并比较了其他例子。

这是我的缩写形式的JSON字符串:

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

GetAssetInfoResponse AssetInfo 包含具有 DataMember 属性的属性,但属性结果(反序列化后)不包含任何对象。

[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字符串转移到类中?

感谢您的时间

1 个答案:

答案 0 :(得分:1)

您将Result声明为List<Dictionary<string, AssetInfo>>,但从格式看起来像字典,而不是字典列表(因为它以{开头,这用于对象,或者字典,而不是用于数组/列表的[。要将此格式用于词典,您需要配置UseSimpleDictionaryFormat属性

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

使用此设置和此更改,它可以工作:

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