gpt4 book ai didi

c# - 序列化json时如何忽略JsonProperty(PropertyName = "someName")?

转载 作者:可可西里 更新时间:2023-11-01 08:00:47 27 4
gpt4 key购买 nike

我有一些使用 ASP.Net MVC 的 C# 代码,它使用 Json.Net 来序列化一些 DTO。为了减少负载,我使用 [JsonProperty(PropertyName = "shortName")] 属性在序列化期间使用较短的属性名称。

当客户端是另一个 .Net 应用程序或服务时,这非常有效,因为反序列化将对象层次结构重新组合在一起,使用更长更友好的名称,同时保持较低的实际传输负载。

当客户端通过浏览器使用 javascript/ajax 时,问题就出现了。它发出请求,并获取 json ...但 json 使用的是缩短的不太友好的名称。

如何让 json.net 序列化引擎以编程方式忽略 [JsonProperty(PropertyName = "shortName")] 属性?理想情况下,我的 MVC 服务将坐在那里运行并通常使用缩短的属性名称进行序列化。当我的代码检测到特定参数时,我想使用较长的名称序列化数据并忽略 [JsonProperty()] 属性。

有什么建议吗?

谢谢,

凯文

最佳答案

这可以使用自定义契约(Contract)解析器轻松完成。这是您需要的所有代码:

class LongNameContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
// Let the base class create all the JsonProperties
// using the short names
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);

// Now inspect each property and replace the
// short name with the real property name
foreach (JsonProperty prop in list)
{
prop.PropertyName = prop.UnderlyingName;
}

return list;
}
}

这是一个使用解析器的快速演示:

class Program
{
static void Main(string[] args)
{
Foo foo = new Foo
{
CustomerName = "Bubba Gump Shrimp Company",
CustomerNumber = "BG60938"
};

Console.WriteLine("--- Using JsonProperty names ---");
Console.WriteLine(Serialize(foo, false));
Console.WriteLine();
Console.WriteLine("--- Ignoring JsonProperty names ---");
Console.WriteLine(Serialize(foo, true));
}

static string Serialize(object obj, bool useLongNames)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
if (useLongNames)
{
settings.ContractResolver = new LongNameContractResolver();
}

return JsonConvert.SerializeObject(obj, settings);
}
}

class Foo
{
[JsonProperty("cust-num")]
public string CustomerNumber { get; set; }
[JsonProperty("cust-name")]
public string CustomerName { get; set; }
}

输出:

--- Using JsonProperty names ---
{
"cust-num": "BG60938",
"cust-name": "Bubba Gump Shrimp Company"
}

--- Ignoring JsonProperty names ---
{
"CustomerNumber": "BG60938",
"CustomerName": "Bubba Gump Shrimp Company"
}

关于c# - 序列化json时如何忽略JsonProperty(PropertyName = "someName")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20622492/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com