2015-06-14 2 views
4

В тесте я хочу заполнить объект (модель представления) из строки JSON. Например, целевой объект обладает этим свойством:Заполнение несериализуемого объекта с помощью Json.NET

public string Query { get; set; } 

Так что я хочу, чтобы быть в состоянии сделать это:

var target = ...; 
JsonConvert.PopulateObject(target, "{ 'Query': 'test' }"); 

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

Я не могу найти способ изменить сериализацию элемента снаружи. Я надеялся, что перегрузка PopulateObject с учетом настроек позволит мне сделать это, но я не вижу никакого способа сделать это.

Как я могу обеспечить, что свойства PopulateObject на моей цели, хотя это не контракт с данными?

+0

Какой ваш 'target' переменная ? –

+0

@Yuval: модель просмотра –

ответ

2

Вы можете создать ContractResolver, который интерпретирует все классы как неавтоматического из, а не отказ в:

public class OptOutContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     return base.CreateProperties(type, MemberSerialization.OptOut); 
    } 
} 

И затем использовать его как:

[JsonObject(MemberSerialization = MemberSerialization.OptIn)] 
//[DataContract] -- also works. 
public class TestClass 
{ 
    public string Query { get; set; } // Not serialized by default since this class has opt-in serialization. 

    public static void Test() 
    { 
     var test = new TestClass { Query = "foo bar" }; 
     var json = JsonConvert.SerializeObject(test, Formatting.Indented); 
     Debug.Assert(!json.Contains("foo bar")); // Assert the initial value was not serialized -- no assert. 
     Debug.WriteLine(json); 

     var settings = new JsonSerializerSettings { ContractResolver = new OptOutContractResolver() }; 
     JsonConvert.PopulateObject("{ 'Query': 'test' }", test, settings); 
     Debug.Assert(test.Query == "test"); // Assert the value was populated -- no assert. 

     Debug.WriteLine(JsonConvert.SerializeObject(test, Formatting.Indented, settings)); 
    } 
} 
Смежные вопросы