【问题标题】:Name array elements in Json.NET?在 Json.NET 中命名数组元素?
【发布时间】:2018-01-13 20:10:27
【问题描述】:

使用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:遇到意外字符 解析值时:{。路径“ids”,第 1 行,位置 9。

我知道我可以将int 包装在一个类中并将其命名为“id”,但我想知道是否可以在没有这些额外工作的情况下完成此操作。原因似乎是SQL Server 2016 的限制。看到这个question

【问题讨论】:

  • 显而易见的做法是使用custom JsonConverter
  • 但是使用自定义转换器,您的 C# 将无法匹配您的 JS。我想这取决于你想躺在哪里。
  • @HenkHolterman 不确定"" 是否比\" 好很多。

标签: c# json.net


【解决方案1】:

您可以自定义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] 属性标记您的数组属性,如下所示。请注意,转换器的类型参数必须与数组的项目类型匹配,属性的第二个参数必须是用于 JSON 数组中的值的属性名称。

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2016-03-03
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多