【发布时间】:2011-11-14 16:57:21
【问题描述】:
我正在尝试生成将在 Dojo javascript 框架中使用的 JSON 文件,并希望返回 position 属性以在 dojo.place() 调用中使用。 position 参数可以是要么 数字或字符串。
使用 StructLayout 似乎无法按原样工作,因为序列化程序会尝试同时发出 String 和 Integer 类型。我正在考虑创建一个自定义ContractResolver,它覆盖CreatePrimitiveContract 以返回一个自定义JsonConverter 类。但是,查看 API,JsonConverter 似乎是基于类型创建的,而不是特定的对象值。
如何使用 Json.NET 序列化程序在 C# 中处理这种情况?
据推测,解决方案将涉及两个带有自定义设置器的属性,以在将一个属性与某种自定义 Json.Net 类一起设置以检查属性值并仅序列化非空属性时,将另一个属性设为空。
** 假设示例 **
// C# struct (or class)
[StructLayout(LayoutKind.Explicit)]
struct DojoPosition {
[JsonProperty(PropertyName="position")]
[FieldOffset(0)]
public String StrPos;
[JsonProperty(PropertyName="position")]
[FieldOffset(0)]
public Int32 IntPos;
}
// Serialization output
DojoPosition pos;
pos.StrPos = "only";
var output = JsonConvert.SerializeObject(pos);
// Output is: { "position": "only" }
pos.IntPos = 3;
var output = JsonConvert.SerializeObject(pos);
// Output is: { "position": 3 }
【问题讨论】:
标签: serialization c#-4.0 dojo json.net unions