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; }
Другие вопросы по тегам