我正在使用外部REST API,它以逗号分隔的整数字符串形式返回一些数据。我一直在使用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&lt; int&gt;和字典&lt; int,int&gt;结果相同。 (之前使用字典的努力是循环迭代器从1开始的原因)
答案 0 :(得分:2)
好的,在安装了Json.NET源代码并逐步完成后,我发现了自己的问题。
问题是继承自JsonConverter
的类(在我的情况下为CellControlSpeedConverter
)必须实现一个名为CanConvert
的方法,该方法告诉Json Serializer您的自定义转换器是否可以执行请求的转换。输入变量为Type objectType
。文档没有说明此变量的用途是什么。
我假设(主要基于方法名称)此变量表示INPUT对象的类型(即,您尝试转换FROM的源对象)。事实证明,这个方法实际上是传递了DESTINATION对象类型。
所以在上面的例子中,如果传递了一个字符串,我的CanConvert
方法返回true,否则返回false。为了使转换工作,我更改了该方法,以便在传递int []时返回true。