c# - Json.NET - 防止重新序列化已经序列化的属性

标签 c# json serialization asp.net-web-api json.net

<分区>

在 ASP.NET Web API 应用程序中,我正在使用的一些模型包含大量仅在客户端有用的临时 JSON。在服务器上,它只是作为字符串进出关系数据库。性能是关键,处理 JSON 字符串服务器端似乎毫无意义。

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

new Person
{
    FirstName = "John",
    LastName = "Smith",
    Json = "{ \"Age\": 30 }"
};

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

{
    "FirstName": "John",
    "LastName": "Smith",
    "Json": "{ \"Age\": 30 }"
}

我希望能够指示 Json.NET 假设 Json 属性已经是一个序列化表示,因此它不应该重新序列化,并且生成的 JSON 应该看起来像这个:

{
    "FirstName": "John",
    "LastName": "Smith",
    "Json": {
        "Age": 30
    }
}

理想情况下,这在两个方向上都有效,即当发布 JSON 表示时,它将自动反序列化为上面的 C# 表示。

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

最佳答案

如果您能够将 Person 上的 Json 属性的类型从 string 更改为 JRaw 那么你会得到想要的结果。

public class Person
{
    public string FirstName { get; set;}
    public string LastName { get; set;}        
    public JRaw Json  { get; set;}
} 

或者,您可以保留 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(); }
    }        
}

无论哪种方式,序列化和反序列化都将按照您的要求进行。

关于c# - Json.NET - 防止重新序列化已经序列化的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32850259/

相关文章:

Java - 将 JSON 转换为 XML 并保持属性

python - 在 python 中,有没有办法提取嵌入的 json 字符串?

java - @JsonTypeResolver 是使用多个属性进行解析的唯一选项吗?

c# - 如何使定时器以重复的方式触发

c# - 以二进制、打包格式序列化结构

c# - 无法用空值序列化 json

java - 通过 TCP channel 发送大文件并进行序列化

c# - 带有 postsharp 2.0 的 Log4Postsharp(死了?)还是放弃了 ELMAH?

c# - 从自托管服务使用 HTTP POST

c# - 将 C# 哈希函数转换为 C++