java - Java Jackson Restlet JSON 与 .NET (Newtonsoft) 客户端使用的多态对象
问题描述
我有一个用java(restlet,jackson)编写的rest api应用程序。它使用 .net Newtonsoft.Json 使用。通信 JSON 包含具有“package.type”格式的多态“@class”属性。JSON 结构具有不同多态派生类对象的数组。这些类型在 .net 中可用(不为每种类型使用转换器)。到目前为止,我能够在 .net 中使用TypeNameHandling
with设置 JsonSettings FormatterAssemblyStyle.Simple
,创建一个SerializationBinder
将 java 包格式处理为 .netFormatterAssemblyStyle.Simple
格式("NamespaceExample.TypeName, AssemblyName"
)的自定义。到目前为止一切顺利,但是我需要在反序列化之前手动将 json 中的“@class”替换为“$type”,反之亦然,在 POST(更新)操作的序列化之后。你知道的更好吗,JsonSettings
更新:示例:
public class CustomSerializationBinder : DefaultSerializationBinder //cool magic
{
private string _assemblyName = "Assembly.Name";
public CustomSerializationBinder()
{
}
public override void BindToName(
Type serializedType, out string assemblyName, out string typeName)
{
assemblyName = null;
typeName = serializedType.FullName;
}
public override Type BindToType(string assemblyName, string typeName)
{
var typeNameWithNamespace = $"{typeName}, {_assemblyName}";
return Type.GetType(typeNameWithNamespace);
}
}
public class Test
{
private JsonSerializerSettings _settings = new JsonSerializerSettings()
{
//Doesn't work directly as it produces a $type property, not a @class as in java
TypeNameHandling = TypeNameHandling.Auto,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple, //Exclude assembly version
Binder = new CustomSerializationBinder()
};
[TestMethod]
public void TypeNameHandlingTest()
{
var filePath = "resources\\json\\javaPolymorphicClassTyped.json";
string json = "";
using (StreamReader reader = new StreamReader(filePath))
{
json = reader.ReadToEnd();
}
// Magic that sucks when deserializing
var jsonFixedType = json.Replace("\"@class\":", "\"$type\":");
Assembly.Name.BaseType[] holderArr = JsonConvert.DeserializeObject<Assembly.Name.BaseType[]>(jsonFixedType, _settings);
string jsonSerialized = JsonConvert.SerializeObject(holderArr, _settings);
// Magic that sucks when serializing
var jsonSerializedFixedType = jsonSerialized.Replace("\"$type\":", "\"@class\":");
Assert.AreEqual(json, jsonSerializedFixedType);
}
}
PS:我知道这个问题并不完美,但我相信对于我希望帮助的多态序列化专家来说已经足够清楚了+没有太多时间浪费在它上面:)
谢谢!
解决方案
推荐阅读
- c# - .net core 5 中的 MessageBox
- r - 计算一个数据框中的列中某个因子的出现次数并在另一个数据框中输出
- powershell - Do/Until 循环询问两次
- php - 在本机浏览器播放器中流式传输 mp3 文件
- python - Python if 语句出错。怎么了?
- python - 如何检查 Tweeter 用户是否可以使用 tweepy 获取直接消息?
- parsing - 如果从文件中读取 Parsec 失败且没有错误
- windows - 在字符串中使用多个变量时,Ansible lineinfile 模块语法错误
- c# - 有没有办法获得正在运行的 ssh 命令的输出?
- javascript - 接口内的条件类型