Json.NET - 阻止重新序列化已经序列化的属性

Tod*_*ier 11 c# serialization json json.net asp.net-web-api

在ASP.NET Web API应用程序中,我正在使用的一些模型包含一小块ad-hoc JSON,它仅在客户端有用.在服务器上,它只是作为字符串进出关系数据库.性能是关键,根本不需要处理JSON字符串服务器端.

所以在C#中,想象一个像这样的对象:

new Person
{
    FirstName = "John",
    LastName = "Smith",
    Json = "{ \"Age\": 30 }"
};
Run Code Online (Sandbox Code Playgroud)

默认情况下,Json.NET会像这样序列化这个对象:

{
    "FirstName": "John",
    "LastName": "Smith",
    "Json": "{ \"Age\": 30 }"
}
Run Code Online (Sandbox Code Playgroud)

我希望能够指示Json.NET假设该Json属性已经是序列化表示,因此它不应该重新序列化,并且生成的JSON应如下所示:

{
    "FirstName": "John",
    "LastName": "Smith",
    "Json": {
        "Age": 30
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,这适用于两个方向,即在POST JSON表示时,它将自动反序列化为上面的C#表示.

使用Json.NET实现这一目标的最佳机制是什么?我需要定制JsonConverter吗?是否有一个更简单的基于属性的机制?效率很重要; 重点是跳过序列化开销,这可能是一个微优化,但为了论证,让我们假设它不是.(可能会Json返回包含大量属性的大列表.)

Mik*_*son 19

如果你能够改变的类型Json物业PersonstringJRaw那么你会得到期望的结果.

public class Person
{
    public string FirstName { get; set;}
    public string LastName { get; set;}        
    public JRaw Json  { get; set;}
} 
Run Code Online (Sandbox Code Playgroud)

或者,您可以保留该string属性,并添加一个JRaw属性以用作序列化的代理:

public class Person
{
    public string FirstName { get; set;}
    public string LastName { get; set;}
    [JsonIgnore]
    public string Json { get; set; }

    [JsonProperty("Json")]
    private JRaw MyJson
    {
        get { return new JRaw(this.Json); }
        set { this.Json = value.ToString(); }
    }        
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,序列化和反序列化都可以按照您的要求运行.

  • 我不知道`JRaw`,看起来最适合我想要解决的问题.谢谢. (2认同)