代码之家  ›  专栏  ›  技术社区  ›  JeroenM

C#Json如何使用任何类型的int键反序列化某些内容

  •  0
  • JeroenM  · 技术社区  · 7 年前

    我正在开发一个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 回复  |  直到 7 年前
        1
  •  0
  •   sheep    7 年前

    您是否尝试过在json表示中使用99作为字符串?

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

    您应该让newtonsoft处理到int的转换。

        2
  •  0
  •   JeroenM    7 年前

    我通过以下操作修复了它:

    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反序列化它,然后遍历列表,然后遍历字典。