C# JsonConverter调用获取基类json并添加自定义

C# JsonConverter调用获取基类json并添加自定义,c#,json,json.net,C#,Json,Json.net,我有一个基类和派生类,我想自定义派生类的JSON序列化/反序列化,但构建在基类中的序列化/反序列化基础上。我不知道如何使用JsonConverter类来实现这一点 示例类 public class MyBase { public long id { get; set; } public virtual string name { get; set; } public string desc { get; set; }

我有一个基类和派生类,我想自定义派生类的JSON序列化/反序列化,但构建在基类中的序列化/反序列化基础上。我不知道如何使用JsonConverter类来实现这一点

示例类

    public class MyBase
    {
        public long id { get; set; }
        public virtual string name { get; set; }
        public string desc { get; set; }
        ...
    }


    [JsonConverter(typeof(MyDerivedSerializer))]
    public class MyDerived : myBase
    {
        public double rate { get; set; }
        public double temp { get; set; }
        ...
    }

    public class MyDerivedSerializer : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
          var baseS = value as MyBase;
          //??? How to get JSON for base class

          //Add items for derived class
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            while ((reader.TokenType != JsonToken.Null) && (reader.TokenType != JsonToken.EndObject))
            {
              JObject jo = JObject.Load(reader);
              JToken itemProps = jo["properties"];
              jo.Remove("properties");
              foreach (JToken c in itemProps.Children())
              {
                if (c.Type == JTokenType.Property)
                {
                  JProperty p = c as JProperty;
                  if (!jo.ContainsKey(p.Name))
                    jo[p.Name] = p.Value;
                }
              }
            }
            //now that the JSON is good, how do I put the data in a created derived object
            var x = Activator.CreateInstance(objectType);
            return x;             
        }

        public override bool CanConvert(Type objectType)
        {
          return true;
        }
    }
使用JSON的工具需要名为“properties”的子字段中的所有派生类属性,但我不能更改我的派生类。因此,我只想使用JSONConverter编辑JSON,如下所示

    {
        "id": 33,
        "name": "xSource",
        "desc": "Main source",
        ...
        "properties": {
            "rate": "3.21",
            "temp": "245.2"
            ...
        }

    }

你会想清理一下,但我得把它吐出来

{“id”:1,“name”:“name”,“desc”:“desc”,“properties”:{“rate”:2.0,“temp”:3.0}}

必须从类中删除decorator,并转移到反序列化调用,就像是stackoverflow

var result = JsonConvert.SerializeObject(test, new KeysJsonConverter());

你是否需要在“属性”中保留派生类属性:{}??是的,我希望在“属性”中保留所有派生类属性:{}我收回这一点,在派生类中有一些项目我将省略。可能重复Yea,当我尝试它时,我使用decorator得到了一个无限递归循环。是否有一种方法可以从该对象获取JObject,而不是从JsonConvert.SerializeObject获取字符串。我以前使用过“JObject.FromObject(derivedObj);”。对不起,没关系,我没有意识到FromObject也有一个格式化选项。没问题。这是一个相当粗糙的poc,如果您需要任何帮助,请让我知道。那么有没有一种简单的方法可以从派生值中查找和删除项(按名称?)。不知道确切是什么。是的。var excludeList=新列表{“速率”};var derivedValues=jo.Properties()。其中(x=>derivedProperties.Any(y=>y.Name==x.Name)和&!excludeList.Any(y=>y==x.Name));“包含列表”正在删除!
var result = JsonConvert.SerializeObject(test, new KeysJsonConverter());