首页 > 解决方案 > Java Jackson Restlet JSON 与 .NET (Newtonsoft) 客户端使用的多态对象

问题描述

我有一个用java(restlet,jackson)编写的rest api应用程序。它使用 .net Newtonsoft.Json 使用。通信 JSON 包含具有“package.type”格式的多态“@class”属性。JSON 结构具有不同多态派生类对象的数组。这些类型在 .net 中可用(不为每种类型使用转换器)。到目前为止,我能够在 .net 中使用TypeNameHandlingwith设置 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:我知道这个问题并不完美,但我相信对于我希望帮助的多态序列化专家来说已经足够清楚了+没有太多时间浪费在它上面:)

谢谢!

标签: java.netjsonserializationjson.net

解决方案


推荐阅读