c# - 使用 Json.NET 填充不可序列化对象

标签 c# .net json json.net

在测试中,我想从 JSON 字符串填充对象( View 模型)。例如目标对象有这个属性:

public string Query { get; set; }

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

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

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

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

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

最佳答案

您可以创建一个 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));
    }
}

关于c# - 使用 Json.NET 填充不可序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825847/

相关文章:

.net - 请求被中止 : Could not create SSL/TLS secure channel sandbox account

asp.net - 加载共享类库时出错

java - JAVA中将两个字符串数组合并为JSON格式

json - Invoke-Webrequest 不正确的 Json 格式 "Cannot bind parameter ' headers' "

javascript - 调用 MapSignalR 导致协议(protocol)错误

c# - 从数据创建的 XML 结构中面临的问题

c# - 从类型 T 访问属性

c# - 如何在 Windows 10 Mobile 上分屏摄像头

c# - .NET Membership.GetUser() 在 ie9 和 safari 中嵌入到 iframe 时为 null

objective-c - Encoding ™ £ 用于 JSON - 使用 objective-c