尝试使用Json.NET反序列化逗号分隔值字符串 - 获取异常

时间:2012-02-03 20:06:58

标签: json.net

我正在使用外部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开始的原因)

1 个答案:

答案 0 :(得分:2)

好的,在安装了Json.NET源代码并逐步完成后,我发现了自己的问题。

问题是继承自JsonConverter的类(在我的情况下为CellControlSpeedConverter)必须实现一个名为CanConvert的方法,该方法告诉Json Serializer您的自定义转换器是否可以执行请求的转换。输入变量为Type objectType。文档没有说明此变量的用途是什么。

我假设(主要基于方法名称)此变量表示INPUT对象的类型(即,您尝试转换FROM的源对象)。事实证明,这个方法实际上是传递了DESTINATION对象类型。

所以在上面的例子中,如果传递了一个字符串,我的CanConvert方法返回true,否则返回false。为了使转换工作,我更改了该方法,以便在传递int []时返回true。