c# - 如何在不添加属性的情况下自定义 Json.net 中嵌套属性的反序列化
问题描述
假设我有这些课程:
public class Bar
{
public Foo MyFoo { get; set; }
}
public class Foo
{
public string[] Stuff { get; set; }
}
我有这个 JSON 结构:
{
"MyFoo":
{
"Stuff":"those,are,my,stuff"
}
}
我有一个代码路径,其中 aJObject
正在转换为Bar
使用如下代码:
myJObject.ToObject(typeof(Bar))
现在我需要做的是提供ToObject
一个自定义序列化程序,将字符串属性转换为字符串Stuff
数组(使用string.Split(...).ToArray()
)
我被要求不要在客户端类“Bar”上添加属性,所以在环顾四周后,它似乎ContractResolver
是有序的,但问题是解析器只允许我处理根类型的直接属性,即Bar
在我的示例中,并且我无法JsonConverter
在嵌套属性上注册 a。
所以我对你们的问题是,这甚至可以使用 Json.net 实现吗?
- 请注意,我不仅需要为
Bar
类执行此操作,还需要为无限数量的具有未知结构的类执行此操作,因此我无法硬编码适用于一种类的解决方案。
解决方案
根据您的描述,我不明白您为什么需要ContractResolver
. 您知道要特别反序列化的属性将始终是 type string[]
,因此只需制作一个处理该类型的转换器。也许是这样的:
public class CsvStringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string[]);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Null)
return null;
if (token.Type == JTokenType.String)
return ((string)token).Split(',');
if (token.Type == JTokenType.Array)
return token.ToObject<string[]>(serializer);
throw new JsonException("Unexpected token type: " + token.Type);
}
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后,要将它与您的JObject
.JsonSerializer
ToObject()
var serializer = new JsonSerializer();
serializer.Converters.Add(new CsvStringConverter());
var bar = myJObject.ToObject<Bar>(serializer);
在这里工作演示:https ://dotnetfiddle.net/qmeBoh
推荐阅读
- razor - ASP.NET Core MVC 将选中的项目从剃刀视图中的表单返回到控制器
- python - 尝试解决 Python 循环元音问题
- r - R:为什么mtmvnorm返回的协方差矩阵是不对称的?
- javascript - 如何在每个日期之后为“TOTAL”添加一行并在谷歌表格中获取该总行中的总金额?
- mysql - 在与mysql的hasMany关系中续集更新数据
- python - AWS Lambda Python Cryptography - 无法打开共享对象文件
- django - django 激活字段没有改变
- c# - 身份服务器客户端凭据流不起作用
- swift - 获取枚举参数值
- python - 尝试使用 Python 中的代码之前给出的已定义名称编写文件时出现路径问题