使用Json.NET填充非可序列化对象

在测试中,我想从JSON字符串填充对象(视图模型)。 例如,目标对象具有以下属性:

public string Query { get; set; } 

所以我希望能够做到这一点:

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

但是,未设置Query属性。 通过代码进行调试,似乎忽略了target上的属性,因为成员序列化是选择加入的。 由于目标类不是数据契约,并且在unit testing之外没有以这种方式填充,因此我无法通过属性将其选择为成员序列化。

我找不到从外部修改成员序列化的方法。 我希望PopulateObject的重载采取设置将允许我这样做,但我没有看到任何方法这样做。

如何确保PopulateObject在我的目标上设置属性,即使它不是数据协定?

您可以创建一个ContractResolver ,将所有类解释为选择退出而不是选择加入:

 public class OptOutContractResolver : DefaultContractResolver { protected override IList 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)); } }