如何配置Json.NET自定义序列化?

3

由于某些超出我的控制范围的原因,我从外部服务获取的数据被格式化为字符串的数组的数组:[["string_one", "string_two"]]

我试图将其反序列化为具有两个属性的对象:

public class MyObject
{
    public string PropertyOne { get; set; }
    public string PropertyTwo { get; set; }
}

我使用Json.NET进行所有JSON序列化/反序列化。当我尝试转换字符串的数组时,会出现异常,提示JsonArray无法转换为MyObject。如何正确实现此功能?
3个回答

2

您的目标对象和JSON之间存在相当大的差异。 您可以手动进行映射:

string json = "[[\"string_one\", \"string_two\"]]";
dynamic result = JsonConvert.DeserializeObject(json);
var myObject = new MyObject
{
    PropertyOne = result[0][0],
    PropertyTwo = result[0][1]
};

不幸的是,这种差异是无法避免的。 - anon

2

最终使用JsonConverter来实现。我将MyObject更改为以下形式:

[JsonConverter(typeof(MyObjectConverter))]
public class MyObject
{
    public string PropertyOne { get; set; }
    public string PropertyTwo { get; set; }
}

然后实现MyObjectConverter:

public class MyObjectConverter : JsonConverter
{
    public override object ReadJson (JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
    {
        int pos = 0;
        string[] objectIdParts = new string[2];

        while (reader.Read())
        {
            if (pos < 1)
            {
                if (reader.TokenType == JsonToken.String)
                {
                    objectIdParts[pos] = reader.Value.ToString();
                    pos++;
                }
            }
            // read until the end of the JsonReader
        }

        return new MyObject(objectIdParts);
    }

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

    public override bool CanWrite {
        get {
            return base.CanWrite;
        }
    }

    public override bool CanRead { get { return true; } }
    public override bool CanConvert (Type objectType) 
    {
        return true;
    }
}

1
说实话,我会将其反序列化为 string[][] 并在您的领域层中进行映射。自定义序列化所花费的时间很少值得去折腾。

1
我不喜欢这样的答案,因为它对那些未来会阅读此答案的遇到类似问题的人没有帮助。 - Henley
@Henley - 幸运的是,有不止一个答案可以选择 ;) - Richard Szalay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接