让我试图通过从一个复杂的对象和大型JSON文本中提取和抽象相关信息来简化我的问题。
Class Foo()
{
string Name;
Version[] versions;
}
JsonText(从XML转换而来)可以是这样的:
"Foo": {
"Name": "test",
"versions": {
"Major": "1",
"Minor": "1"
},
"versions": {
"Major": "2",
"Minor": "1"
},
"versions": {
"Major": "3",
"Minor": "1"
}
}
或如下:
"Foo": {
"Name": "test",
"versions": {
"Major": "1",
"Minor": "1"
}
}
JsonConvert.DeserializeObject(JsonText)的结果是:
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'Version[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
是否有可能进行这种去罪化?
发布于 2019-06-01 23:45:08
基于评论的更新
你的Json看起来不成立。Json需要与“一起使用。例如,
[ "Ford", "BMW", "Fiat" ]
如果允许修改Json,则可以按以下方式修改Json
{
"Foo":
{
"Name": "test",
"versions": [
{
"Major": "1",
"Minor": "1"
},
{
"Major": "2",
"Minor": "1"
},
{
"Major": "3",
"Minor": "1"
}]
}
}
基于您的注释,如果只有一个元素,您希望避免Json数组语法。在其他情况下,您希望坚持数组语法。在这种情况下,您可以编写自定义Json转换器。
class CustomConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<T>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
{
return token.ToObject<List<T>>().ToArray();
}
return new List<T> { token.ToObject<T>() }.ToArray();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
您可以使用JsonConverter属性来修饰类以使用自定义Json转换器。
class Wrapper
{
public Foo Foo{get;set;}
}
class Foo
{
[JsonProperty("Name")]
public string Name{get;set;}
[JsonProperty("versions")]
[JsonConverter(typeof(CustomConverter<Version>))]
public Version[] versions{get;set;}
}
现在您可以反序列化为
var result =JsonConvert.DeserializeObject<Wrapper>(str);
如果您使用以下任何一个Json定义,现在就可以使用了。
{
'Foo':
{
'Name': 'test',
'versions': [
{
'Major': '1',
'Minor': '1'
},
{
'Major': '2',
'Minor': '1'
},
{
'Major': '3',
'Minor': '1'
}]
}
}
单一版本(没有数组语法)
{
'Foo':
{
'Name': 'test',
'versions':
{
'Major': '1',
'Minor': '1'
}
}
}
https://stackoverflow.com/questions/56409029
复制相似问题