反序列化后,JSON字段值变为空

时间:2019-05-11 08:02:39

标签: c# json xamarin.ios

我有一个像这样的JSON字符串

{
  "data": {
    "id": "f4ba528a54117950",
    "type": "password-requests",
    "links": {
      "self": "https://api.abc.com/api/v2/password-requests/f4ba528a54117950"
    },
    "attributes": {
      "login": "abc",
      "type": "agent",
      "send-media": false,
      "registration-token": "ced84635eba"
    }
  }
}

我的课程是这样的

public  class SightCallResult
{
    public SightCallData data { get; set; }
}

public class SightCallData
{
    public string id { get; set; }
    public string type { get; set; }
    public Dictionary<string, string> links { get; set; }
    public AgentAttributes attributes { get; set; }

}

public class AgentAttributes
{
    public string Login { get; set; }
    public string Type { get; set; }
    public bool SendMedia { get; set; }
    public string RegistrationToken { get; set; }
}

这是我反序列化字符串的方式

sightCallRslt = JsonConvert.DeserializeObject<SightCallResult>(resultMobileToken);
sightCallData = sightCallRslt.data;
agentAttributes = sightCallData.attributes;
Debug.WriteLine(agentAttributes.RegistrationToken);

但是RegistrationToken始终为null。但是其他字段值已正确分配。任何人都可以解释这是什么原因。

2 个答案:

答案 0 :(得分:2)

我认为您正在使用Newtonsoft.Json,它不会自动将连字符的键名映射到PascalCase的键名。

例如,您可能没有注意到它。 send-media,因为它不可为空/默认为false。

如果您无法更改json,则可以使用JsonProperty装饰属性:

        [JsonProperty(PropertyName="send-media")]
        public bool SendMedia { get; set; }
        [JsonProperty(PropertyName="registration-token")]
        public string RegistrationToken { get; set; }

答案 1 :(得分:1)

attributes的类型更改为Dictionary<string, object>,或者如果您确定数量有限的可能属性,请使用JsonPropertyAttribute指定确切的名称:

[JsonProperty("registration-token")]
public string RegistrationToken { get; set; }