【问题标题】:json serialization and deserialization with xamarin App isn't working as expected使用 xamarin App 的 json 序列化和反序列化未按预期工作
【发布时间】:2020-11-23 04:58:47
【问题描述】:

我正在尝试进行序列化和反序列化, 但不知何故,它在 xamarin 应用程序上的工作与在控制台应用程序上的工作方式相同, 使用此 json 字符串和自定义包装器的快速示例

    public class JsonWrapper
{
    public string ObjType { get; set; }
    public object Obj { get; set; }
}

这是一个需要明确的json直接字符串

            var json =
            "{\"ObjType\":\"System.Exception\",\"Obj\":{\"ClassName\":\"System.Exception\",\"Message\":\"Printer Is Not Connected\",\"Data\":null,\"InnerException\":null,\"HelpURL\":null,\"StackTraceString\":null,\"RemoteStackTraceString\":null,\"RemoteStackIndex\":0,\"ExceptionMethod\":null,\"HResult\":-2146233088,\"Source\":null,\"WatsonBuckets\":null}}\r\n";
        var obj= JsonConvert.DeserializeObject<JsonWrapper>(json);

        var type = Type.GetType(obj.ObjType);
        var obj2 = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj.Obj), type);
        var message = (obj2 as Exception).Message;

它会得到缺少信息的消息变量,我的意思是不会得到打印机未连接的消息, 相同的代码在控制台应用程序中运行良好,所以 idk, 有人可以帮忙吗?

【问题讨论】:

  • 您是否声称 JsonConvert 在不同平台上的工作方式不同?如果是这样,那是一个错误,但是很可能它不是一个错误,并且您正在做一些不同的事情。现在由你来证明它完全一样
  • 它完全一样,我正在尝试使用应该与@TheGeneral 相同的直接 json 字符串

标签: java c# json xamarin


【解决方案1】:

我刚刚在 主要活动 中使用 Level 29, 10.0 (Q) SDK 编译的 Xamarin Android 上运行了与您完全相同的代码,并且效果很好

屏幕截图



【讨论】:

  • 很奇怪,仍然收到相同的消息,即“抛出了 'System.Exception' 类型的异常。”甚至将目标更改为相同,并且一切都 idk
  • @Felixanius 尝试捕获异常,并粘贴实际的异常消息
  • 它不是一个例外,我收到的 obj2 实例类似于“New Exception();” ,我的意思是丢失所​​有信息,不知道为什么@TheGeneral
  • @Felixanius 很难为您提供帮助。很难确切地知道您所看到的内容,您的环境是什么,我只知道我运行您的代码并且它可以工作(如您所见)。我的直觉是你正在做一些你没有在你的问题中表现出来的事情。或者也许还有其他事情是遗漏的,但除非你真的努力解释正在发生的事情以及确切的代码、设置、环境等,否则我们不可能知道。
  • 没什么好解释的,不知何故我在反序列化后得到了错误的值,你可以检查我添加的评论,应该得到相同的异常实例@TheGeneral
【解决方案2】:

我无法重现您的问题。我得到了与 TheGeneral 相同的结果。

也许您可以为您的Obj 数据自定义Type 作为一种解决方法。

喜欢:

publcic class JsonWrapper
    {
        public string ObjType { get; set; }
        public Bean Obj { get; set; }

        public class Bean
        {
            public string ClassName { get; set; }
            public string Message { get; set; }
            public string Data { get; set; }
            public string InnerException { get; set; }
             ...
        }
    }

那么你可以得到消息:

 var json = "{\"ObjType\":\"System.Exception\",\"Obj\":{\"ClassName\":\"System.Exception\",\"Message\":\"Printer Is Not Connected\",\"Data\":null,\"InnerException\":null,\"HelpURL\":null,\"StackTraceString\":null,\"RemoteStackTraceString\":null,\"RemoteStackIndex\":0,\"ExceptionMethod\":null,\"HResult\":-2146233088,\"Source\":null,\"WatsonBuckets\":null}}\r\n";
 var obj = JsonConvert.DeserializeObject<JsonWrapper>(json);
 var obj2 = obj.Obj;
 var message = obj2.Message;

【讨论】:

  • jsonwrapper 用于处理不同的类型,在转换为 json 字符串然后反序列化到另一个 JsonWrapper 类之前,还有另一个具有相同字段名称和通用的类进行序列化,无论如何这不是问题即使像我在评论中提到的那样直接序列化和反序列化对象,xamarin 应用程序也存在问题,您可以检查@Leo Zhu
【解决方案3】:

我的问题是在反序列化 Json 字符串后我没有得到相同的实例 不知道为什么

请检查这个,在控制台应用程序上,我得到一个异常实例,其中包含相同的消息或原始实例中的任何数据

【讨论】:

  • 这很奇怪,我像你上面那样创建了一个异常,但我可以得到我之前定义的正确消息。
猜你喜欢
  • 2017-05-05
  • 2018-05-17
  • 1970-01-01
  • 2020-11-20
  • 2019-01-02
  • 2018-10-05
  • 1970-01-01
  • 2012-09-05
  • 2020-10-16
相关资源
最近更新 更多