C # Json, как десериализовать что-то с ключом, который может быть любым - PullRequest
0 голосов
/ 17 мая 2018

Я работаю над приложением Xamarin и использую Newtonsoft для Json. Но у меня проблемы с обработкой некоторых данных, которые я получаю.

{
"ok": true,
"payment-methods": [
     {
     "id": "39sahf92ka9s02",
         "type": "ideal",
            "options": {
                "issuers": {
                    99: "Test Issuer"
                }
            }
        }
    ],
}

Я не знаю, как добраться до издателя теста, поскольку значение ключа может быть любым целым числом.

Словарь имеет большой смысл в использовании, но затем я получаю следующее исключение: «System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. Json»

У меня есть следующие модели:

[JsonObject(MemberSerialization.OptIn)]
public class PaymentOptions
{
    [JsonProperty("ok")]
    public Boolean OK { get; set; }
    [JsonProperty("payment-methods")]
    public List<PaymentMethods> PaymentMethods { get; set; }
}
public class PaymentMethods
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("type")]
    public string Type { get; set; }
    [JsonProperty("options")]
    public Options Options { get; set; }
}
public class Options
{
    [JsonProperty("issuers")]
    public IDictionary<int, string> Issuers { get; set; }
}

Я десериализую Json с помощью следующего:

var deserializedGetPaymentOptions = JsonConvert.DeserializeObject<Models.PaymentMethods>(await responseGetPaymentOptions.Content.ReadAsStringAsync());

И после этого я пытаюсь прочитать его, используя цикл foreach:

foreach (KeyValuePair<int, string> issuerFromDict in deserializedGetPaymentOptions.Options.Issuers)

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я исправил это, выполнив следующее:

var deserializedGetPaymentOptions = JsonConvert.DeserializeObject<Models.PaymentOptions>(await responseGetPaymentOptions.Content.ReadAsStringAsync());
                foreach (var desPayOp in deserializedGetPaymentOptions.PaymentMethods) {
                    Debug.WriteLine("start foreach");
                    foreach (KeyValuePair<int, string> issuerFromDict in desPayOp.Options.Issuers)
                    {
                        Debug.WriteLine(issuerFromDict.Key.ToString() + " : " + issuerFromDict.Value);
                    }
                }

Теперь я десериализую его из PaymentOptions вместо PaymentMethods, затем перебираю список и, затем, словарь.

0 голосов
/ 17 мая 2018

Вы пробовали с 99 в качестве строки в представлении json?

...
"issuers": {
    "99": "Test Issuer"
}
...

Вам следует разрешить newtonsoft предложения по конвертации в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...