2015-10-27 4 views
2

Учитывая следующий фрагмент кода, за исключением:JSON.NET TypeNameHandling.Auto для верхнего уровня

using System; 
using Newtonsoft.Json; 

namespace JsonTestje 
{ 
    class Other 
    { 
     public string Message2 { get; set; } 
    } 

    class Demo 
    { 
     public string Message { get; set; } 
     public Other Other { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var demo = new Demo 
      { 
       Message = "Hello, World!", 
       Other = new Other 
       { 
        Message2 = "Here be dragons!" 
       } 
      }; 

      var settings = new JsonSerializerSettings 
      { 
       TypeNameHandling = TypeNameHandling.Auto, 
       Formatting = Formatting.Indented 
      }; 
      var serialized = JsonConvert.SerializeObject(demo, settings); 
      Console.WriteLine(serialized); 
     } 
    } 
} 

Выход заключается в следующем:

{ 
    "Message": "Hello, World!", 
    "Other": { 
    "Message2": "Here be dragons!" 
    } 
} 

Теперь, если я изменю TypeNameHandling к TypeNameHandling.All, выход становится этим:

{ 
    "$type": "JsonTestje.Demo, JsonTestje", 
    "Message": "Hello, World!", 
    "Other": { 
    "$type": "JsonTestje.Other, JsonTestje", 
    "Message2": "Here be dragons!" 
    } 
} 

Но то, что я хочу это:

{ 
    "$type": "JsonTestje.Demo, JsonTestje", 
    "Message": "Hello, World!", 
    "Other": { 
    "Message2": "Here be dragons!" 
    } 
} 

Причина заключается в том, что я хочу, чтобы иметь возможность сериализации кучу объектов и десериализации их позже, не зная, что они типа десериализации, но я также не хочу, чтобы загрязнить содержимое с этими $type свойствами повсюду, где они не нужны.

Другими словами, я хочу TypeNameHandling.Auto, за исключением корневого объекта. Как мне это сделать?

ответ

4

Ну, я понял, изучив источник.

Существует перегрузка, которая позволяет указать «корневой тип», который вы передаете. Если сериализатор обнаруживает, что тип, который вы передали, не то же самое (будучи потомком), он будет выписывать имя типа. Ключ должен указать System.Object в качестве вашего типа корня, например:

var serialized = JsonConvert.SerializeObject(demo, typeof(object), settings); 
Смежные вопросы