DataContractJsonSerializer не работает
Я использую DataContractJsonSerializer для преобразования строки JSON в класс, но всегда возвращаю пустой объект. Я проверил строку с расширением ' JSON Viewer' в Блокноте, действительно. Долго искал ошибку и сравнивал другие примеры.
Это моя строка JSON в сокращенном виде:
{
"error":[],
"result": {
"BCH": {"aclass":"currency","altname":"BCH","decimals":10,"display_decimals":5},
"DASH": {"aclass":"currency","altname":"test"}
}
}
Классы 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 в классы?
Спасибо за ваше время
1 ответ
Вы заявляете Result
как List<Dictionary<string, AssetInfo>>
но по формату это выглядит как словарь, а не список словарей (потому что он начинается с {
, это используется для объектов или словарей, а не [
который используется для массивов / списков) . Чтобы использовать этот формат для словарей, необходимо настроить UseSimpleDictionaryFormat
имущество
var serializer = new DataContractJsonSerializer(typeof(GetAssetInfoResponse), new DataContractJsonSerializerSettings
{
UseSimpleDictionaryFormat = true
});
С этим параметром и этим изменением это сработало:
public Dictionary<string, AssetInfo> Result { get; set; }