【问题标题】:Trying to deserialize comma-separated value string using Json.NET - getting exception尝试使用 Json.NET 反序列化逗号分隔值字符串 - 出现异常
【发布时间】:2012-02-03 20:06:58
【问题描述】:

我正在使用一个外部 REST API,它以逗号分隔的整数字符串形式返回一些数据。我一直在使用 Json.NET 来反序列化我进入 POCO 的数据。我在我的类中添加了一个 int[] 属性,并编写了一个自定义转换器来将逗号分隔的字符串解析为一个 int 数组。当我运行我的代码时,虽然我得到一个错误,

“Int32[] Observations 上的 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 和 Dictionary,结果相同。 (之前对字典的努力是循环迭代器从 1 开始的原因)

【问题讨论】:

    标签: json.net


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 稍加思考后,这确实是有道理的。输入类型几乎总是字符串,输出类型可用作选择器。感谢您抽出宝贵时间回答您自己的问题 +1
    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多