我正在尝试反序列化从网站检索到的JSON到POCO中,我坚持这样一个事实,即json.net不会反序列化带有前面@
符号的属性。
我在SO上发现了许多帖子,它们指出解决方案是用JsonPropertyAttribute
注释POCO中的C#属性并直接指定属性名称。我这样做了,但是我的C#属性仍然是null
。
POCO代码:
[Newtonsoft.Json.JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
public class Event : IEvent
{
private readonly String name;
private readonly String context;
private readonly String type;
private readonly UInt32 id;
private readonly DateTime startDate;
private readonly DateTime endDate;
public Event(String name)
{
this.name = name;
}
[JsonProperty(Required = Required.Always, PropertyName = "@context")]
public String Context { get { return this.context; } }
[JsonProperty(Required = Required.Always, PropertyName = "@type")]
public String Type { get { return this.type; } }
[JsonProperty(Required = Required.Always)]
public String Name { get { return this.name; } }
public UInt32 ID { get { return this.id; } }
public DateTime StartDate { get { return this.startDate; } }
public DateTime EndDate { get { return this.endDate; } }
}
反序列化代码:
public void Test()
{
string innerHtml = @"{
""@context"": ""http:\/\/ schema.org"",
""@type"": ""Event"",
""name"": ""Kabarett Tipps in \u00d6sterreich: Diese K\u00fcnstler sollten Sie nicht verpassen"",
""location"": {
""@type"": ""Place"",
""address"": {
""@type"": ""PostalAddress"",
""addressCountry"": ""AT"",
""addressLocality"": ""Wien - Landstrasse"",
""postalCode"": ""1030"",
""streetAddress"": null
},
""name"": ""Ganz \u00d6sterreich"",
""url"": ""\/l\/ganz-oesterreich""
},
""url"": ""\/e\/kabarett-tipps-in-oesterreich-diese-kuenstler-sollten-sie-nicht-verpassen#st-241664441"",
""startDate"": ""2018-06-18"",
""endDate"": ""2019-06-24"",
""image"": ""https:\/\/cdn.kurier.at\/img\/100\/210\/772\/kabarett.jpg""
}";
IEvent @event = JsonConvert.DeserializeObject<Event>(innerHtml);
}
我看到Name
被填充,但是Type
和Context
仍然是null
。有人在观察这个问题吗?
答案 0 :(得分:0)
正如Brian Rogers指出的那样,我的POCO属性是只读的。 Json.net的文档指出:
由于JsonConverter创建了一个新值,因此转换器将无法工作 具有只读属性,因为无法分配新属性 价值的财产。要么改变财产以公开 设置或将JsonPropertyAttribute或DataMemberAttribute放置在 属性。
显然将该属性放在属性上并没有达到预期的效果。我将属性放在支持属性的私有只读字段中,最终产生了所需的结果。 感谢Brian的指示:)