当对象与 JSON 不匹配时,如何在 C# 中执行自定义 JSON 序列化和反序列化



我在 asp.net 应用程序的后端有一个类。这需要序列化为 JSON 并发送到前端。这没有问题,除了序列化。类如下所示(类名等已更改(:

public class ClassA
{
// There are some properties here that need to be serialized normally
public string Name { get; set; }
// This array needs custom serialization
public ClassB[] Objects { get; set; }
}

B类看起来像这样:

public class ClassB
{
public EnumA SomeEnum { get; set; }
}
public enum EnumA{ A = 0, B = 1, C = 2 }

我需要将其序列化为如下所示:

{"name":"someName","objects":[2,1,1,0]}

在这里,对象数组应该用 ClassB 的 someEnum 属性的数字值填充。

到目前为止,我有这个添加到 ClassA 的功能,但我觉得这应该以不同的方式完成:

public string ToJson()
{
string result = "{";
result += ""name":"" + Name + "",";
result += ""objects":[";
for (int i = 0; i < Objects.Length; i++)
{
result += (int)Objects[i].SomeEnum;
if (i < Objects.Length - 1)
result += ",";
}
result += "]}";
return result;
}

我如何以更好的方式做到这一点?我还需要将生成的 JSON 反序列化回 ClassA 对象。感谢所有帮助。

您可以使用Newtonsoft JSON。

首先,向类添加JsonProperty属性:

public class ClassA
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("objects")]
public ClassB[] Objects { get; set; }
}

现在创建一个ClassBConverter

public class ClassBConverter : JsonConverter<ClassB> {
...
public override void WriteJson(JsonWriter writer, ClassB value, JsonSerializer serializer)
{
writer.WriteValue((int)value.SomeEnum);
}
public override ClassB ReadJson(JsonReader reader, Type objectType, ClassB existingValue, bool hasExistingValue, JsonSerializer serializer)
{
int i = (int)((long) reader.Value);
return new ClassB { SomeEnum = i };
}
}

然后做:

JsonConvert.(De)SerializeObject<ClassA>(yourJSONString, new ClassBConverter());

最新更新