如何强制自定义类型的序列化/反序列化?

时间:2017-11-22 10:22:14

标签: c# serialization

这是我的代码:

void Main()
{
    var test = new Order()
    {
        Id = Guid.NewGuid(),
        Title = "Test",
        Code = new Code("O-123456789") // TODO create a Code.NewCode() later
    };
    var line = Newtonsoft.Json.JsonConvert.SerializeObject(test).ToString();
    Console.WriteLine(line);
}

// Define other methods and classes here
public class Order
{
    public Guid Id { get; set; }
    public Code Code { get; set; }
    public string Title { get; set; }
}

public class Code
{
    public string code;

    public Code(string code)
    {
        this.code = code;
    }
}

在控制台上我得到了这个结果:

{"Id":"227599fe-c834-4330-84e5-2018abe59e35","Code":{"code":"O-123456789"},"Title":"Test"}

但我想要这个:

{"Id":"227599fe-c834-4330-84e5-2018abe59e35","Code":"O-123456789","Title":"Test"}

那么如何强制我的代码类型按我想要的顺序化。实际上,我想要Guid()的相同行为。或者找到一种实现String()的方法。你能帮帮我吗?

我知道我可能会使用某些属性来强制JSON序列化,但我想要一些适用于所有序列化的东西,就像Guid()

一样

3 个答案:

答案 0 :(得分:1)

您可以创建一个新的JsonConverter来处理您的类型,然后按照您喜欢的方式对其进行序列化:

public class CodeSerializer : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var code = value as Code;
        writer.WriteValue(code.code);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(Code).IsAssignableFrom(objectType);
    }
}

完成此操作后,您可以通过在SerializeObject上设置一些属性将其插入JsonSerializerSettings方法:

var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.Converters.Insert(0, new CodeSerializer());
var line = Newtonsoft.Json.JsonConvert.SerializeObject(test, jsonSerializerSettings).ToString();
Console.WriteLine(line);
// {"Id":"2010e737-a9e8-4b77-bde6-1c50e92c6a30","Code":"O-123456789","Title":"Test"}

答案 1 :(得分:0)

也许你可以这样做;

    public class Order
    {
        public Guid Id { get; set; }

        [JsonIgnore]
        public Code Code { get; set; }

        public string SerializedCode
        {
            get
            {
                if (Code != null)
                {
                    return Code.code;
                }
                return string.Empty;
            }
        }

        public string Title { get; set; }
    }

Output : {"Id":"227599fe-c834-4330-84e5-2018abe59e35","SerializedCode":"O-123456789","Title":"Test"}

实际上,您无法对所有序列化操作执行此操作。没有通用的方法来执行它。也许你可以提供自己的序列化器类。但我认为,这不是一个好的解决方案。您不希望序列化输出和类对象 彼此不同。这可能会引起另一个问题。我建议你改变你的类和属性来执行它。

答案 2 :(得分:0)

答案是David Watts在评论中给出的答案:

Json.Net将Guid的.Net Primitive转换为字符串(JSON Primitive)。有关newtonsoft.com/json/help/html/SerializationGuide.htm

的所有详细信息

在较高的层次上,Json.NET序列化程序会将原始.NET值转换为原始JSON值,将.NET数组和集合转换为JSON数组,并将其他所有内容转换为JSON对象。

对于其他自定义序列化,我必须使用Kevin Smith解释的JsonConverter。

相关问题