gpt4 book ai didi

serialization - 如何使用 Json.NET 在 C# 中序列化 "union-like"字段

转载 作者:行者123 更新时间:2023-12-01 05:36:54 25 4
gpt4 key购买 nike

我正在尝试生成一个将在 Dojo javascript 框架中使用的 JSON 文件,并希望返回一个 position要在 dojo.place() 中使用的属性称呼。 position参数可以是 要么 一个数字或一个字符串。

使用 StructLayout似乎无法按原样工作,因为序列化程序会尝试同时发出 String 和 Integer 类型。我正在考虑创建一个自定义 ContractResolver 覆盖 CreatePrimitiveContract返回自定义 JsonConverter 类(class)。但是,查看 API,似乎是 JsonConverter是基于类型创建的,而不是特定的对象值。

如何使用 Json.NET 序列化程序在 C# 中处理这种情况?

据推测,该解决方案将涉及两个带有自定义 setter 的属性,当一个属性与某种自定义 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 }

最佳答案

我刚刚遇到了类似的问题。
有关合约的简单操作,请查看:Overriding the serialization behaviour in Json.Net

为了解决 JsonPrimitiveContract 覆盖 CreateContract方法。

以下是基于我们解决方案的示例:

   public class JsonDotNetContractResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
if (typeof(DojoPosition).IsAssignableFrom(objectType))
{
return new JsonPrimitiveContract(objectType.GetGenericArguments()[1])
{
CreatedType = typeof(object), // Not sure this will work for you, or is necessary...
IsReference = false,
Converter = DojoPositionConverter,
};
}
return base.CreateContract(objectType);
}
private class DojoPositionConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var dp = (DojoPosition) value;
if(string.IsNullOrEmpty(dp.StrPos))
serializer.Serialize(writer,dp.IntPos);
else
serializer.Serialize(writer,dp.StrPos);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
//...
}
public override bool CanConvert(Type objectType)
{
//....
}
}
}

如何从阅读器中确定要反序列化的类型是您的功课;)

关于serialization - 如何使用 Json.NET 在 C# 中序列化 "union-like"字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8125124/

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