Я пытаюсь сгенерировать файл JSON, который будет использоваться в среде JavaScript Dojo, и хотел бы вернуть атрибут position
, который будет использоваться в вызове dojo.place()
. Параметр position
может быть или числом или строкой.
Использование StructLayout
, по-видимому, не будет работать как есть, так как сериализатор будет пытаться испускать оба типа String и Integer. Я смотрю на создание пользовательского ContractResolver
, который переопределяет CreatePrimitiveContract
для возврата пользовательского JsonConverter
класса. Однако, глядя на API, кажется, что JsonConverter
создается на основе типа, а не конкретного значения объекта.
Как мне справиться с этим делом в C # с помощью сериализатора Json.NET?
Предполагается, что решение будет включать два свойства с пользовательскими установщиками для обнуления другого свойства, когда оно устанавливается вместе с каким-то пользовательским классом 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 }