【问题标题】:Deserialize an object into another similar object of another type json.net将一个对象反序列化为另一种类型 json.net 的另一个类似对象
【发布时间】:2015-03-20 10:13:08
【问题描述】:

我有一个类似于Cannot deserialize JSON array into type - Json.NET 的问题,但我仍然遇到错误。

所以,我有 3 个课程:

public class Class1
{
    public string[] P2 { get; set; }
}

public class Class2
{
    public Wrapper<string>[] P2 { get; set; }
}

public class Wrapper<T>
{
    public T Value { get; set; }
}

我正在尝试将 Class 2 序列化为字符串并返回 Class 1。 方法如下:

Class2 c2 = new Class2 
{ 
     P2 = new Wrapper<string>[] 
        {
            new Wrapper<string> { Value = "a" },
            new Wrapper<string> { Value = "a" },
        },
};

string s = JsonConvert.SerializeObject(c2);
Class1 c1 = (Class1)JsonConvert.DeserializeObject(s, typeof(Class1), new FormatConverter());

FormatConverter 类定义如下:

public class FormatConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (objectType == typeof(string[]))
        {
            List<string> list = new List<string>();
            while (reader.Read())
            {
                if (reader.TokenType != JsonToken.StartObject)
                {
                    continue;
                }
                Wrapper<string> obj = (Wrapper<string>)serializer.Deserialize(reader, typeof(Wrapper<string>));
                list.Add(obj.Value);
            }
            return list.ToArray();
        }
    }

    public override bool CanConvert(Type type)
    {
        if (type == typeof(string[]))
        {
            return true;
        }
        return false;
    }
}

我错过了什么?我得到以下异常:

An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll

Additional information: Unexpected end when deserializing object. Path '', line 1, position 46.

谢谢, 亚历克斯

【问题讨论】:

  • 我注意到,DeserializeObject 失败,即使在 ReadJson 中我只是返回一个数组,如下所示:return new string[1] { "a" };

标签: json types deserialization


【解决方案1】:

我自己设法找到了答案。方法如下:

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (type == typeof(string[]) && reader.TokenType == JsonToken.StartArray)
        {
            //remove converter not to trigger a recursive call
            var converter = serializer.Converters[0];
            serializer.Converters.RemoveAt(0);

            //deserialization into correct type
            Wrapper<string>[] obj = (Wrapper<string>[])serializer.Deserialize(reader, typeof(Wrapper<string>[]));

            //restore converter
            serializer.Converters.Add(converter);

            if (obj != null)
            {
                return obj.Select(w => w == null ? null : w.Value).ToArray();
            }
            return reader.Value;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多