Helpex - Trao đổi & giúp đỡ Đăng nhập
36

Tôi có một JsonConvertercái mà, tùy thuộc vào một trường hợp cờ cụ thể, cần phải

  • chạy logic tuần tự hóa tùy chỉnh
  • chạy logic tuần tự hóa Json.NET mặc định

Làm cách nào để có thể chạy logic tuần tự hóa Json.NET mặc định từ a JsonConverter?

Cảm ơn

36 hữu ích 1 bình luận 12k xem chia sẻ
14

Đây là một ví dụ. Giả sử lớp của bạn để tuần tự hóa trông như thế này:

class Foo
{
    public bool IsSpecial { get; set; }
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
}

Các IsSpecialcờ được sử dụng để kiểm soát xem chúng tôi làm điều gì đó đặc biệt trong bộ chuyển đổi hoặc chỉ để cho điều serialize một cách tự nhiên. Bạn có thể viết trình chuyển đổi của mình như sau:

class FooConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(Foo).IsAssignableFrom(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Foo foo = (Foo)value;
        JObject jo;
        if (foo.IsSpecial)
        {
            // special serialization logic based on instance-specific flag
            jo = new JObject();
            jo.Add("names", string.Join(", ", new string[] { foo.A, foo.B, foo.C }));
        }
        else
        {
            // normal serialization
            jo = JObject.FromObject(foo);
        }
        jo.WriteTo(writer);
    }

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

Sau đó, để sử dụng bộ chuyển đổi, hãy chuyển một phiên bản của nó cho SerializeObjectphương thức (ví dụ: trong cài đặt). (KHÔNG trang trí lớp đích bằng một JsonConverterthuộc tính, nếu không điều này sẽ dẫn đến một vòng lặp đệ quy vô hạn khi bạn tuần tự hóa.)

class Program
{
    static void Main(string[] args)
    {
        List<Foo> foos = new List<Foo>
        {
            new Foo
            {
                A = "Moe",
                B = "Larry",
                C = "Curly",
                IsSpecial = false
            },
            new Foo
            {
                A = "Huey",
                B = "Dewey",
                C = "Louie",
                IsSpecial = true
            },
        };

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Converters.Add(new FooConverter());
        settings.Formatting = Formatting.Indented;

        string json = JsonConvert.SerializeObject(foos, settings);
        Console.WriteLine(json);
    }
}

Đầu ra:

[
  {
    "IsSpecial": false,
    "A": "Moe",
    "B": "Larry",
    "C": "Curly"
  },
  {
    "names": "Huey, Dewey, Louie"
  }
]
14 hữu ích 4 bình luận chia sẻ
6

Bạn có thể thay đổi thuộc tính CanWrite để tắt bộ nối tiếp tùy chỉnh. Điều này sẽ không hoạt động nếu đối tượng có thể chứa con cùng loại hoặc nếu bạn đang tuần tự hóa trong nhiều luồng.

class FooConverter : JsonConverter
{
    bool _canWrite = true;
    public override bool CanWrite
    {
        get { return _canWrite;}
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Foo foo = (Foo)value;
        JObject jo;
        if (foo.IsSpecial)
        {
            // special serialization logic based on instance-specific flag
            jo = new JObject();
            jo.Add("names", string.Join(", ", new string[] { foo.A, foo.B, foo.C }));
        }
        else
        {
            // normal serialization
            _canWrite = false;
            jo = JObject.FromObject(foo);
            _canWrite = true;
        }
        jo.WriteTo(writer);
    }
}
6 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c# serialization json.net , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading