C# 当对象与JSON不匹配时,如何在C中进行自定义JSON序列化和反序列化
我在asp.net应用程序的后端有一个类。这需要序列化为JSON并发送到前端。除了序列化之外,这没有问题。该类看起来像这样的类名,这些名称已更改:C# 当对象与JSON不匹配时,如何在C中进行自定义JSON序列化和反序列化,c#,json,asp.net-core,json-deserialization,json-serialization,C#,Json,Asp.net Core,Json Deserialization,Json Serialization,我在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 p
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; }
}
ClassB如下所示:
public class ClassB
{
public EnumA SomeEnum { get; set; }
}
public enum EnumA{ A = 0, B = 1, C = 2 }
{"name":"someName","objects":[2,1,1,0]}
我需要将其序列化为以下内容:
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对象。非常感谢您的帮助。您可以使用
首先,将JsonProperty属性添加到类中:
public class ClassA
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("objects")]
public ClassB[] Objects { get; set; }
}
现在创建一个ClassBConverter:
然后做:
JsonConvert.(De)SerializeObject<ClassA>(yourJSONString, new ClassBConverter());
您是否在使用Newtonsoft或System.Text.Json?在本例中不是,而是在其他地方?看起来您没有使用任何框架来序列化或反序列化Json。如果您使用的是.NET Framework,我建议您使用Newtonsoft;如果您使用的是.NET Core,我建议您使用内置System.Text.Json。如果可能,我希望重写我创建的函数并使用System.Text.Json添加反序列化。谢谢。我将尝试此操作,并很快返回报告。我在WriteJson方法中编辑为intvalue.SomeEnum而不是intSomeEnum。这是正确的吗?序列化似乎有效!但反序列化时确实会出错:无法将类型为“System.Int64”的对象强制转换为类型为“System.Int32”。联机:inti=intreader.Value;它起作用了!谢谢。我会编辑你的答案并接受它。