使用序数索引

时间:2017-12-24 19:33:59

标签: c# arrays json json.net deserialization

this lecture about Json Schemas中,我们可以验证json数组是否具有特定索引的特定类型(在那里称为元组)。例如街道地址的元组:

[NUMBER, STREET_NAME, STREET_TYPE, DIRECTION] // Structure
[1600, "Pennsylvania", "Avenue", "NW"] // Example

此(固定长度)数组中的不同项表示:

  • (int) NUMBER :地址编号。
  • (字符串) STREET_NAME :街道名称。
  • (枚举) STREET_TYPE :街道的类型。可以是StreetAvenueBoulevard
  • (枚举) DIRECTION :地址的城市象限。可以是NWNESWSE

使用Newtonsofts Json.Net对这种数组进行反序列化的简洁方法是什么?该模型应如下所示:

public class StreetAddress
{
    public int Number { get; set; }
    public string StreetName { get; set; }
    public StreetType StreetType { get; set; }
    public Direction Direction { get; set; }
}

public enum StreetType
{
    Street,
    Avenue,
    Boulevard
}

public enum Direction
{
    Nw,
    Ne,
    Sw,
    Se
}

是否有属性来定义每个属性的序数索引或使用例如属性的属性整个模型ArrayConverter?好吧,我们可以使用JArray并从索引中分配每个属性,但这感觉不是很顺利。

1 个答案:

答案 0 :(得分:0)

这就是我设置数据类StreetAddress的方法:

public class StreetAddress
{
    [JsonProperty(Order = 1)]
    public Int32 Number { get; set; }

    [JsonProperty(Order = 2)]
    public String StreetName { get; set; }

    [JsonProperty(Order = 3)]
    [JsonConverter(typeof(StringEnumConverter))]
    public StreetType StreetType { get; set; }

    [JsonProperty(Order = 3)]
    [JsonConverter(typeof(StringEnumConverter))]
    public Direction Direction { get; set; }
}

然后,您必须使用StringEnumConverter实现正确的枚举器转换类型:

[JsonConverter(typeof(StringEnumConverter))]
public enum StreetType
{
    [EnumMember(Value = "Street")]
    Street,
    [EnumMember(Value = "Avenue")]
    Avenue,
    [EnumMember(Value = "Boulevard")]
    Boulevard
}

[JsonConverter(typeof(StringEnumConverter))]
public enum Direction
{
    [EnumMember(Value = "Nw")]
    Nw,
    [EnumMember(Value = "Ne")]
    Ne,
    [EnumMember(Value = "Sw")]
    Sw,
    [EnumMember(Value = "Se")]
    Se
}

这足以解析您的数据。