json.net反序列化@prefixed属性

时间:2018-06-30 17:51:51

标签: c# json.net

我正在尝试反序列化从网站检索到的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被填充,但是TypeContext仍然是null。有人在观察这个问题吗?

1 个答案:

答案 0 :(得分:0)

正如Brian Rogers指出的那样,我的POCO属性是只读的。 Json.net的文档指出:

  

由于JsonConverter创建了一个新值,因此转换器将无法工作   具有只读属性,因为无法分配新属性   价值的财产。要么改变财产以公开   设置或将JsonPropertyAttribute或DataMemberAttribute放置在   属性。

显然将该属性放在属性上并没有达到预期的效果。我将属性放在支持属性的私有只读字段中,最终产生了所需的结果。 感谢Brian的指示:)