在Json.NET?

时间:2018-01-13 20:10:27

标签: c# json.net

使用Json.NET 10.0.3。请考虑以下示例:

class Foo
{
   [JsonProperty("ids")]
   public int[] MyIds { get; set; }
}

显然,数组的元素是未命名的。现在考虑以下json

{
  "ids": [{
      "id": 1
    }, {
      "id": 2
    }
  ]
}

然后我们尝试解析它:

var json = @"{""ids"":[{""id"":1},{""id"":2}]}";
var result = JsonConvert.DeserializeObject<Foo>(son);

解析上述内容失败,并显示以下消息:

  

Newtonsoft.Json.JsonReaderException:遇到意外的字符   在解析值时:{。路径&#39;,第1行,第9位。

我知道我可以将int包装在一个类中并命名为#34; id&#34;在那里,但我想知道如果没有这项额外的工作可以做到这一点。原因似乎是SQL Server 2016中的限制。请参阅此question

1 个答案:

答案 0 :(得分:0)

您可以在两种数组格式之间进行自定义JsonConverter转换:

class CustomArrayConverter<T> : JsonConverter
{
    string PropertyName { get; set; }

    public CustomArrayConverter(string propertyName)
    {
        PropertyName = propertyName;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JArray array = new JArray(JArray.Load(reader).Select(jo => jo[PropertyName]));
        return array.ToObject(objectType, serializer);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        IEnumerable<T> items = (IEnumerable<T>)value;
        JArray array = new JArray(
            items.Select(i => new JObject(
                new JProperty(PropertyName, JToken.FromObject(i, serializer)))
            )
        );
        array.WriteTo(writer);
    }

    public override bool CanConvert(Type objectType)
    {
        // CanConvert is not called when the [JsonConverter] attribute is used
        return false;
    }
}

要使用转换器,请使用[JsonConverter]属性标记数组属性,如下所示。请注意,转换器的type参数必须与数组的项类型匹配,属性的第二个参数必须是用于JSON数组中的值的属性名。

class Foo
{
    [JsonProperty("ids")]
    [JsonConverter(typeof(CustomArrayConverter<int>), "id")]
    public int[] MyIds { get; set; }
}

这是一个往返演示:https://dotnetfiddle.net/vUQKV1