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



我正在使用一个外部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。

相关内容

  • 没有找到相关文章

最新更新