在没有具体对象的接口上使用JsonConvert遇到麻烦

时间:2019-01-21 19:44:49

标签: c# json interface json.net

在将消息反序列化为 undefined 对象时遇到一些麻烦。我将其称为未定义对象,因为我没有任何类似于消息数据的适当类。我只有一个界面。 由于我要处理的项目比较繁琐,因此除非您觉得有必要询问,否则我不会显示每一行代码。

我有一个接口,我们称它为ITest(它本身实现了其他接口和其他类。因此这是一个非常复杂的接口)

在我的范围内,我收到一个完全按照此接口ITest模式使用JsonConvert序列化的“消息”。 我不会详细介绍它实际上是如何序列化的,但是该解决方案不能用于反序列化方面。。问题来了:

由于我必须将此消息反序列化到界面中,所以……我显然不能。因此,我尝试了许多(许多)解决方法。使用其他Nuget(例如“ Impromptu接口”或Castle.Core),甚至自动将我的接口映射为Object类型(动态),但是代码无法编译,或者我只能获取一半的数据,或者只能获取具有null / 0值的属性。我最接近的是Impromptu ...我现在有点绝望。

我不想让那些该死的混凝土类型。因为我需要很多。 DRY概念正在流血rn:(

这是即兴表演

var obj = ActLike<ITest>(message)

这是自动映射

    public interface ITest
    {
        string Test { get; set; }
        int Val { get; set; }
    }

    static void Main(string[] args)
    {
        Mapper.Initialize(cfg => { });

        var a = new { Test = "test", Val = 1 };
        ITest b = Mapper.Map(a, typeof(Object), typeof(ITest)) as ITest;

    }

我在哪里尝试将该死的“ var a”更改为动态Json对象,以用于映射。还有很多其他事情...

是的...我现在有点卡住了。

谢谢您能给我的帮助!

2 个答案:

答案 0 :(得分:0)

我可能缺少问题的一部分,但这可能是一个选择。在序列化对象中添加一些类型信息。

  static void Main(string[] args)
    {
        var objectToSerialize = new List<IFoo>() {
            new TestClass()
            {
                Test = "A",
                Test2 = "B"
            },
              new TestClass2()
            {
                Test = "C",
                Test3 = "D"
            },

        };
        // TODO: Add objects to list
        var jsonString = JsonConvert.SerializeObject(objectToSerialize, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
        var deserializedObject = JsonConvert.DeserializeObject<List<IFoo>>(jsonString, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
        var result = deserializedObject;
    }
}

internal interface IFoo
{
     string Test { get; set; }
}
public class TestClass : IFoo
{
    public string Test { get; set; }
    public string Test2 { get; set; }
}
public class TestClass2 : IFoo
{
    public string Test { get; set; }
    public string Test3 { get; set; }
}

答案 1 :(得分:0)

我有点找到了使用MassTransit代理系统的解决方案:

            JsonSerializer jsonMessageDeserializer = JsonMessageSerializer.Deserializer;

            Type type = typeof(T);
            if (type.IsInterface && TypeMetadataCache.IsValidMessageType(type))
                type = TypeMetadataCache.GetImplementationType(type);

            using (Stream body = new MemoryStream(Encoding.UTF8.GetBytes(message)))
                using (StreamReader streamReader = new StreamReader(body, Encoding.UTF8, false, 1024, true))
                    using (JsonTextReader jsonTextReader = new JsonTextReader((TextReader)streamReader)) 
                    {
                        Object objBody = jsonMessageDeserializer.Deserialize((JsonReader)jsonTextReader);
                        JsonReader r = ((JsonReader)new JTokenReader(GetMessageToken((objBody))));
                        object obj2 = jsonMessageDeserializer.Deserialize(r, type);