Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用Json.NET填充不可序列化对象_C#_.net_Json_Json.net - Fatal编程技术网

C# 用Json.NET填充不可序列化对象

C# 用Json.NET填充不可序列化对象,c#,.net,json,json.net,C#,.net,Json,Json.net,在测试中,我想从JSON字符串填充一个对象(视图模型)。例如,目标对象具有以下属性: public string Query { get; set; } 所以我希望能够做到这一点: var target = ...; JsonConvert.PopulateObject(target, "{ 'Query': 'test' }"); 但是,未设置查询属性。通过代码调试,似乎忽略了target上的属性,因为成员序列化是opt-in。由于目标类不是数据协定,并且在单元测试之外没有以这种方式填充,

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

public string Query { get; set; }
所以我希望能够做到这一点:

var target = ...;
JsonConvert.PopulateObject(target, "{ 'Query': 'test' }");
但是,未设置
查询
属性。通过代码调试,似乎忽略了
target
上的属性,因为成员序列化是opt-in。由于目标类不是数据协定,并且在单元测试之外没有以这种方式填充,因此我无法通过属性将其选择到成员序列化中

我找不到从外部修改成员序列化的方法。我希望通过设置
PopulateObject
的过载可以让我这样做,但我看不到任何方法

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

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

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

您的
目标
变量是什么类型?@Yuval:视图模型
[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));
    }
}