C# JsonConverter调用获取基类json并添加自定义
我有一个基类和派生类,我想自定义派生类的JSON序列化/反序列化,但构建在基类中的序列化/反序列化基础上。我不知道如何使用JsonConverter类来实现这一点 示例类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; }
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());