当对象与 JSON 不匹配时,如何在 C# 中执行自定义 JSON 序列化和反序列化
How to do custom JSON serialization and deserialization in C#, when the object does not match the JSON
我在 asp.net 应用程序的后端有一个 class。这个需要序列化为JSON发送给前端。这没问题,除了序列化。 class 看起来像这样(class 名称等已更改):
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]}
这里objects数组应该填入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());
我在 asp.net 应用程序的后端有一个 class。这个需要序列化为JSON发送给前端。这没问题,除了序列化。 class 看起来像这样(class 名称等已更改):
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]}
这里objects数组应该填入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());