我正在使用一个外部REST API,该API将一些数据作为一个由整数组成的comm-aseparated字符串返回。我一直在使用Json.NET来反序列化我进入POCO的数据。我在类中添加了一个int[]属性,并编写了一个自定义转换器来将逗号分隔的字符串解析为int数组。当我运行我的代码时,尽管我得到了一个错误
"Int32[]观测上的JsonConverter CellControlSpeedConverter与成员类型Int32[]不兼容"
这是我的会员声明:
[JsonProperty(PropertyName = "speed-list")]
[JsonConverter(typeof(CellControlSpeedConverter))]
int[] Observations { get; set; }
这是我的JsonConverter ReadJson:(为了简洁起见,省略了其他方法,请忽略过于迂腐的语法,正在尝试任何方法来实现这一点)
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
throw new ArgumentException(String.Format("Unexpected token parsing speed observations. Expected String, got {0}.", reader.TokenType));
}
string delimitedObservations = reader.Value.ToString().Trim();
char[] delimiter = new char[1] { ',' };
string[] observations = delimitedObservations.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
int[] output = new int[observations.Length];
for (int sequence = 1; sequence <= observations.Length; sequence++)
{
string observation = observations[sequence - 1];
int speed = 0;
if (int.TryParse(observation, out speed))
{
output[sequence - 1] = speed;
}
else
{
throw new ArgumentException(String.Format("Unexpected speed value parsing speed observations. Expected Int, got {0}", observation));
}
}
return output;
}
我尝试过其他一些成员类型,如List<int>以及Dictionary<int,int>结果相同。(之前对字典的研究是循环迭代器从1开始的原因)
好吧,在安装Json.NET源代码并逐步完成后,我发现了自己的问题。
问题是从JsonConverter
(在我的例子中是CellControlSpeedConverter
)继承的类必须实现一个名为CanConvert
的方法,该方法"告诉"Json序列化程序您的自定义转换器是否可以执行请求的转换。输入变量为Type objectType
。文档中没有说明这个变量的用途
我假设(主要基于方法名称)这个变量表示INPUT对象的类型(也就是说,您试图转换FROM的源对象)。事实证明,该方法实际上传递了DESTINATION对象类型。
因此,在我上面的例子中,如果传递字符串,我的CanConvert
方法返回true,否则返回false。为了使转换工作,我更改了该方法,使其在传递int[]时返回true。