在测试中,我想从JSON字符串填充对象(视图模型)。例如,目标对象具有以下属性:
public string Query { get; set; }
所以我希望能够做到这一点:
var target = ...;
JsonConvert.PopulateObject(target, "{ 'Query': 'test' }");
但是,未设置Query
属性。通过代码进行调试,似乎忽略了target
上的属性,因为成员序列化是选择加入的。由于目标类不是数据契约,并且在单元测试之外没有以这种方式填充,因此我无法通过属性将其选择为成员序列化。
我找不到从外部修改成员序列化的方法。我希望PopulateObject
采取设置的超载允许我这样做,但我没有看到任何方法这样做。
即使不是数据合同,我如何确保PopulateObject
设置目标属性?
答案 0 :(得分: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));
}
}