使用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。
答案 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