C#Json如何使用任何类型的int键反序列化某些内容
我正在开发一个Xamarin应用程序,我使用Newtonsoft处理Json。 但是我在处理我得到的一些数据时遇到了麻烦C#Json如何使用任何类型的int键反序列化某些内容,c#,xamarin,json.net,C#,Xamarin,Json.net,我正在开发一个Xamarin应用程序,我使用Newtonsoft处理Json。 但是我在处理我得到的一些数据时遇到了麻烦 { "ok": true, "payment-methods": [ { "id": "39sahf92ka9s02", "type": "ideal", "options": { "issuers": { 99: "Test Issuer"
{
"ok": true,
"payment-methods": [
{
"id": "39sahf92ka9s02",
"type": "ideal",
"options": {
"issuers": {
99: "Test Issuer"
}
}
}
],
}
我不知道如何到达测试颁发者,因为键值可以是任何整数
使用字典很有意义,但我得到了以下异常:“System.NullReferenceException:Object reference未设置为Object.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; }
}
[JsonObject(MemberSerialization.OptIn)]
公共类支付选项
{
[JsonProperty(“ok”)]
公共布尔OK{get;set;}
[JsonProperty(“付款方式”)]
公共列表PaymentMethods{get;set;}
}
公共类支付方法
{
[JsonProperty(“id”)]
公共字符串Id{get;set;}
[JsonProperty(“类型”)]
公共字符串类型{get;set;}
[JsonProperty(“期权”)]
公共选项选项{get;set;}
}
公共类选项
{
[JsonProperty(“发行人”)]
公共IDictionary发行者{get;set;}
}
我通过以下方式反序列化Json:
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);
}
}
var deserializedGetPaymentOptions=JsonConvert.DeserializeObject(wait responseGetPaymentOptions.Content.ReadAsStringAsync())代码>
然后我试着在foreach循环中使用它来阅读:
foreach(反序列化dgetPaymentOptions.Options.Issuers中的KeyValuePair issuerFromDict)
您是否尝试过在json表示中使用99作为字符串
...
"issuers": {
"99": "Test Issuer"
}
...
您应该让newtonsoft处理到int的转换。我通过执行以下操作修复了它:
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);
}
}
var deserializedGetPaymentOptions=JsonConvert.DeserializeObject(wait responseGetPaymentOptions.Content.ReadAsStringAsync());
foreach(反序列化dgetPaymentOptions.PaymentMethods中的var desPayOp){
Debug.WriteLine(“启动foreach”);
foreach(desPayOp.Options.Issuers中的KeyValuePair issuerFromDict)
{
Debug.WriteLine(issuerFromDict.Key.ToString()+“:”+issuerFromDict.Value);
}
}
现在,我从PaymentOptions而不是PaymentMethods反序列化它,然后在列表中循环,然后在字典中循环。在foreach循环中读取发行人有什么不对?:)@姆拉登布。可能什么都没有,我想我在模型中将它声明为字典是有原因的?但我不确定:xtry枚举属性可能:您能展示一下如何将Json反序列化为对象吗?您的Json示例高于有效的Json吗?我确实从API中得到了一个字符串,但是我可以问编程那个部分的人为什么做出这个选择,也许可以说服他把它改成字符串。但是,我仍然不知道该属性将被称为什么(这可能也是一个问题?),在这方面,您确实需要信任newtonsoft反序列化。但是,我仍然不知道该属性将被称为什么(这可能也是一个问题?)您指的是哪个属性?99?对象:名称-值对的无序集合,其中名称(也称为键)是字符串。(参见)