DataContractJsonSerializer 不工作
DataContractJsonSerializer not working
我使用 DataContractJsonSerializer 将 JSON 字符串转换为 class,但总是 return 一个空对象。
我在记事本中用'JSON Viewer'扩展测试了这个字符串,是有效的。找了很久的bug,对比了其他例子
这是我的 JSON 字符串的缩写形式:
{
"error":[],
"result": {
"BCH": {"aclass":"currency","altname":"BCH","decimals":10,"display_decimals":5},
"DASH": {"aclass":"currency","altname":"test"}
}
}
classes GetAssetInfoResponse 和 AssetInfo 包含具有 DataMember 属性的属性,但 属性 Result (反序列化后)不包含任何对象。
[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 字符串转换为 classes 吗?
感谢您的宝贵时间
你把Result
声明为一个List<Dictionary<string, AssetInfo>>
但是从格式上看它看起来像一个字典,而不是一个字典列表(因为它以{
开头,这用于对象,或字典,而不是用于 arrays/lists) 的 [
。要将此格式用于词典,您需要配置 UseSimpleDictionaryFormat
属性
var serializer = new DataContractJsonSerializer(typeof(GetAssetInfoResponse), new DataContractJsonSerializerSettings
{
UseSimpleDictionaryFormat = true
});
通过此设置和此更改,它起作用了:
public Dictionary<string, AssetInfo> Result { get; set; }
我使用 DataContractJsonSerializer 将 JSON 字符串转换为 class,但总是 return 一个空对象。 我在记事本中用'JSON Viewer'扩展测试了这个字符串,是有效的。找了很久的bug,对比了其他例子
这是我的 JSON 字符串的缩写形式:
{
"error":[],
"result": {
"BCH": {"aclass":"currency","altname":"BCH","decimals":10,"display_decimals":5},
"DASH": {"aclass":"currency","altname":"test"}
}
}
classes GetAssetInfoResponse 和 AssetInfo 包含具有 DataMember 属性的属性,但 属性 Result (反序列化后)不包含任何对象。
[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 字符串转换为 classes 吗?
感谢您的宝贵时间
你把Result
声明为一个List<Dictionary<string, AssetInfo>>
但是从格式上看它看起来像一个字典,而不是一个字典列表(因为它以{
开头,这用于对象,或字典,而不是用于 arrays/lists) 的 [
。要将此格式用于词典,您需要配置 UseSimpleDictionaryFormat
属性
var serializer = new DataContractJsonSerializer(typeof(GetAssetInfoResponse), new DataContractJsonSerializerSettings
{
UseSimpleDictionaryFormat = true
});
通过此设置和此更改,它起作用了:
public Dictionary<string, AssetInfo> Result { get; set; }