C# json映射的类属性声明无效
我从C# json映射的类属性声明无效,c#,json,asp.net-mvc,mailgun,C#,Json,Asp.net Mvc,Mailgun,我从mailgunapi收到了以下json { "items": [{ "delivery-status": { "message": null, "code": 605, "description": "Not delivering to previously bounced address", "session-seconds": 0 }, "event": "failed", "log-level": "e
mailgunapi
收到了以下json
{
"items": [{
"delivery-status": {
"message": null,
"code": 605,
"description": "Not delivering to previously bounced address",
"session-seconds": 0
},
"event": "failed",
"log-level": "error",
"recipient": "test@test.com"
},
{
//some other properties of above types
}]
}
现在我正试图为上面的json
创建一个类结构,以便在反序列化后自动映射属性
public class test
{
public List<Item> items { get; set; }
}
public class Item
{
public string recipient { get; set; }
public string @event { get; set; }
public DeliveryStatus delivery_status { get; set; }
}
public class DeliveryStatus
{
public string description { get; set; }
}
现在,在上面的类项中,收件人
和@事件
得到了正确的映射,因为它是关键字
,所以我假设使用前面的@
字符,并且效果很好。但是json
中的delivery status
属性未与class DeliveryStatus
中的delevery\u status
属性映射。我已尝试将其创建为deliveryStatus
或@deliveryStatus
。前一个不会再次映射,后一个抛出编译时异常。这些事情是否可以处理,比如声明一个属性,中间有-
?我无法更改响应json
,因为它不是从我的终端生成的。希望得到一些帮助
更新
更改了类,如下所示,引用,但没有帮助。它的null
再次出现
public class Item
{
public string @event { get; set; }
[JsonProperty(PropertyName = "delivery-status")]
public DeliveryStatus deliveryStatus { get; set; }
}
我不确定你这方面的问题是什么,但如果你使用这段代码,至少它是有效的。确保在您的项目中包含最新版本的Newtonsoft.Json,这样您就没事了
public class DeliveryStatus
{
public object message { get; set; }
public int code { get; set; }
public string description { get; set; }
[JsonProperty("session-seconds")]
public int session_seconds { get; set; }
}
public class Item
{
[JsonProperty("delivery-status")]
public DeliveryStatus delivery_status { get; set; }
public string @event { get; set; }
[JsonProperty("log-level")]
public string log_level { get; set; }
public string recipient { get; set; }
}
public class RootObject
{
public List<Item> items { get; set; }
}
public static void Main(string[] args)
{
string json = @"{
""items"": [{
""delivery-status"": {
""message"": null,
""code"": 605,
""description"": ""Not delivering to previously bounced address"",
""session-seconds"": 0
},
""event"": ""failed"",
""log-level"": ""error"",
""recipient"": ""test@test.com""
}]
}";
RootObject r = JsonConvert.DeserializeObject<RootObject>(json);
}
公共类交付状态
{
公共对象消息{get;set;}
公共整数代码{get;set;}
公共字符串说明{get;set;}
[JsonProperty(“会话秒”)]
公共int会话_秒{get;set;}
}
公共类项目
{
[JsonProperty(“交付状态”)]
public DeliveryStatus delivery_status{get;set;}
公共字符串@event{get;set;}
[JsonProperty(“日志级别”)]
公共字符串日志_级别{get;set;}
公共字符串收件人{get;set;}
}
公共类根对象
{
公共列表项{get;set;}
}
公共静态void Main(字符串[]args)
{
字符串json=@”{
“项目”:[{
“交付状态”:{
“”消息“”:空,
“代码”:605,
“”说明“”:“”未传递到以前跳转的地址“”,
“会话秒数”:0
},
“”事件“”:“”失败“”,
“日志级别”“:”“错误”“,
“收件人”:test@test.com""
}]
}";
rootobjectr=JsonConvert.DeserializeObject(json);
}
使用的是Json.NET
(可以处理此问题),而不是默认的JavaScriptSerializer
选项?DeliveryStatus
类只有很少的属性,而不是一个。有:message、code、description、session-seconds。对于Json.NET
,如果您将属性名称更改为(比如)DeliveryStatus
,那么这应该可以工作。我假设您已将序列化程序设置为使用Json.NET。看不出它不起作用的任何原因,但我目前无法测试它(如果您没有解决它,将在周末检查)。我不知道出了什么问题,但我更改了此行(test)json。反序列化(resp.Content,typeof(test))代码>到测试r=JsonConvert.DeserializeObject(分别为内容)代码>是的,现在它可以工作了。。因此,基本上,反序列化
在json.Deserialize
?我猜您是在尝试将Microsoft的JavaScriptSerializer
与json.NET的JsonProperty
属性混合使用。那不行,是的。。这就是问题所在。。无论如何。。很高兴知道解决办法。。非常感谢,谢谢@StephenMuecke。。终于解决了……)
public class DeliveryStatus
{
public object message { get; set; }
public int code { get; set; }
public string description { get; set; }
[JsonProperty("session-seconds")]
public int session_seconds { get; set; }
}
public class Item
{
[JsonProperty("delivery-status")]
public DeliveryStatus delivery_status { get; set; }
public string @event { get; set; }
[JsonProperty("log-level")]
public string log_level { get; set; }
public string recipient { get; set; }
}
public class RootObject
{
public List<Item> items { get; set; }
}
public static void Main(string[] args)
{
string json = @"{
""items"": [{
""delivery-status"": {
""message"": null,
""code"": 605,
""description"": ""Not delivering to previously bounced address"",
""session-seconds"": 0
},
""event"": ""failed"",
""log-level"": ""error"",
""recipient"": ""test@test.com""
}]
}";
RootObject r = JsonConvert.DeserializeObject<RootObject>(json);
}