当对象与 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());