- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一些使用 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/
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 5 年前。 假设我有一个像这样的对象数组
所以我定义了一个带有属性的类 - 在本示例中我们将其称为 propertyName。我在实现中使用 @synthesize 设置了属性。 我有一个名为 objectToNSDictionary 的方法
我正在使用 java.util.Properties 对象,我通常使用 keySet() 来获取属性的所有键。 我想知道 keySet() 或 propertyNames() 哪个更好。 proper
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
在试图更好地理解 javascript 背后的原型(prototype)时,我偶然发现了以下内容,到目前为止我还无法理解。 我知道函数是一等对象,但我不明白为什么 Object 在 Function.
我已经看到在同一个项目中使用了这两种样式,我想知道它们之间是否存在任何语义差异,或者是否会推荐任何一种风格以及为什么。 最佳答案 只要您有一个带有类型参数的复杂属性路径,您就会遇到一个显着的差异。 从
在 objective-c 中通过“propertyname”和“self.propertyname”访问属性之间有什么区别?你能在答案中涵盖: 什么是最佳做法? 这两种方法如何影响内存管理(保留计数
我有这样的对象定义 var obj = { abcdefghijkl: 'abcdefghijkl', other_key: 1234 }; 我可以在 Javascript 中将获取属性名称的对象本身
在 javascript 中,我们可以使用键而不是索引号从数组中选择一个值,执行如下操作: objectName["propertyName"] 或 objectName.propertyName J
我不知道正则表达式, 但是我需要正则表达式来计算ClassName.PropertyName吗? 需要验证 appSettings 中的一些值是否符合 ClassName.PropertyName 约
在实现 INotifyPropertyChanged 时,我一直不确定 propertyName 的含义。所以通常你将 INotifyPropertyChanged 实现为: public class
我面临的问题是,当我有一个类的属性具有如下默认值时: public class Border { public Border() { InitializeAdornment()
我有一些使用 ASP.Net MVC 的 C# 代码,它使用 Json.Net 来序列化一些 DTO。为了减少负载,我使用 [JsonProperty(PropertyName = "shortNam
故事 我在我的应用中使用 Firebase 实时数据库。我有一个类似这样的模型。 class Item { int mItemName; // Simplified for brevi
This question already has answers here: JavaScript property access: dot notation vs. brackets? (13个回
这是我的 xaml,它告诉 collectionviewsource 排序属性名称。 上面的 xaml 工作正
源代码 我有一些代码要求我调用一个属性 setter 来测试一个类的锁定功能是否正常工作(该类的一些函数是async,要求挂锁 bool 值是在执行期间设置)。如果已为实例设置锁,则已编写 sette
源代码 我有一些代码要求我调用一个属性 setter 来测试一个类的锁定功能是否正常工作(该类的一些函数是async,要求挂锁 bool 值是在执行期间设置)。如果已为实例设置锁,则已编写 sette
我正在尝试将我的 Winforms UI 绑定(bind)到我的 ViewModel。我能够在 UI 更改时成功更新我的 ViewModel,反之亦然。但是,我似乎无法理解 PropertyChang
有 Spring Data Rest reference有人可以解释一下排序表达式 ($propertyname,)+[asc|desc]? ?它看起来像正则表达式,但我怀疑。 我知道,如果我简单地将
我是一名优秀的程序员,十分优秀!