使用json时为啥转不了net.sf.ezmorph.bean.morphdynabean cannot be cast to ja

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用json时为啥转不了net.sf.ezmorph.bean.morphdynabean cannot be cast to ja相关的知识,希望对你有一定的参考价值。

如果电脑使用程序时转不了,出现这样的错误信息,可能是内存出现了故障,需要换一个内存解决问题。
内存是电脑的记忆部件,用于存放电脑运行中的原始数据、中间结果以及指示电脑工作的程序。
内存可以分为随机访问存储器和只读存储器,前者允许数据的读取与写入,磁盘中的程序必须被调入内存后才能运行,中央处理器可直接访问内存,与内存交换数据。电脑断电后,随机访问存储器里的信息就会丢失。后者的信息只能读出,不能随意写入,即使断电也不会丢失。
由于电路的复杂性因素,电脑中都使用二进制数,只有0和1两个数码,逢二进一,最容易用电路来表达,比如0代表电路不通,1代表电路通畅。人们平时用电脑时感觉不到它是在用二进制计算是因为电脑会把人们输入的信息自动转换成二进制,算出的二进制数再转换成人们能看到的信息显示到屏幕上。
在存储器中含有大量的基本单元,每个存储单元可以存放八个二进制位,即一个零到二百五十五之间的整数、一个字母或一个标点符号等,叫做一个字节。存储器的容量就是以字节为基本单位的,每个单元都有唯一的序号,叫做地址。中央处理器凭借地址,准确地操纵着每个单元,处理数据。由于字节这个单位太小了,我们定义了几个更大的单位,这些单位是以2的十次幂做进位,单位有KB、MB、GB、TB等。
常见的内存包括同步动态随机存储器、双倍速率同步动态随机存储器、接口动态随机存储器。
参考技术A MorphDynaBean cannot be cast to java.util.Map在JSONObject.toBean的时候如... 从redis取出来:将json的string转化为..为什么转不了net.sf.ezmorph.bean.morphdynabean cannot be本回答被提问者和网友采纳 参考技术B 使用的不对吧,要json转实体类呢

为啥使用 Json.NET 序列化为 json 字符串时缺少 DriveInfo 的属性?

【中文标题】为啥使用 Json.NET 序列化为 json 字符串时缺少 DriveInfo 的属性?【英文标题】:Why are DriveInfo's properties missing when serializing to json string using Json.NET?为什么使用 Json.NET 序列化为 json 字符串时缺少 DriveInfo 的属性? 【发布时间】:2016-09-07 06:57:44 【问题描述】:

尝试使用此代码将 DrivInfo 序列化为 Json 字符串仅返回“名称”属性:

DriveInfo dr = new DriveInfo("C");    
string json = Newtonsoft.Json.JsonConvert.SerializeObject(dr);

字符串结果只有: "_name":"C:\"

DrivInfo 是密封的,所以我无法更改任何内容。有没有办法不包装?

【问题讨论】:

为什么要序列化你无法控制的类型?如果 MS 决定更改 DriveInfo 的实现怎么办? 为了在公司内部使用,我编写了一个程序来转储环境信息。所以对象被序列化然后反序列化为 xml 文件。由于 XmlSerializer 与默认构造函数的限制,我使用序列化的 json 字符串。 【参考方案1】:

你的难点在于DriveInfo实现了ISerializable接口用于自定义序列化,而Json.NET默认尊重这个接口,使用它来序列化和反序列化类型。由于DriveInfo 完全由驱动器的名称定义,这就是它的自定义序列化代码存储到序列化流中的全部内容。

由于您只想转储DriveInfo 的属性而不关心反序列化,您可以通过设置DefaultContractResolver.IgnoreSerializableInterface = true 来禁用ISerializable。然而,如果你这样做,你会得到一个无限递归序列化dr.RootDirectory.Root.Root...。要解决此问题,您可以为DirectoryInfo 创建一个JsonConverter

public class DirectoryInfoConverter : JsonConverter

    public override bool CanConvert(Type objectType)
    
        return objectType == typeof(DirectoryInfo);
    

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    
        if (reader.TokenType == JsonToken.Null)
            return null;
        var token = JToken.Load(reader);
        return new DirectoryInfo((string)token);
    

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    
        writer.WriteValue(value.ToString());
    

那么你可以这样做:

DriveInfo dr = new DriveInfo("C");
var settings = new JsonSerializerSettings 
 
    ContractResolver = new DefaultContractResolver  IgnoreSerializableInterface = true ,
    Converters = new []  new DirectoryInfoConverter() ,
;
var json = Newtonsoft.Json.JsonConvert.SerializeObject(dr, Formatting.Indented, settings);

但是在这一点上,序列化一个中间匿名类型可能更容易:

var json = JsonConvert.SerializeObject(
    new
    
        Name = dr.Name,
        DriveType = dr.DriveType,
        DriveFormat = dr.DriveFormat,
        IsReady = dr.IsReady,
        AvailableFreeSpace = dr.AvailableFreeSpace,
        TotalFreeSpace = dr.TotalFreeSpace,
        TotalSize = dr.TotalSize,
        RootDirectory = dr.RootDirectory.ToString(),
        VolumeLabel = dr.VolumeLabel
    ,
    Formatting.Indented);

(当然,你不能以这种格式反序列化它。)

【讨论】:

【参考方案2】:

该类包含它自己的自定义序列化,它指定只应包含_name 字段。其他属性不存储在类中。它们是由环境决定的,因此不能用反序列化的值替换。

来自source code:

private const String NameField = "_name";  // For serialization

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    
        // No need for an additional security check - everything is public.
        info.AddValue(NameField, _name, typeof(String));
    

其他属性是通过实际检查DriveInfo 引用的驱动器来确定的。 TotalFreeSpaceTotalFreeSize 之类的属性可以随时更改,并且可能不会(可能不会)应用于可以反序列化该类的另一台计算机上。

如果您可以序列化整个事物并在其他地方反序列化,那么就有可能创建一个所有属性值都错误的类的反序列化实例,因为例如,他们实际上描述了另一台计算机上的c: 驱动器。但是该类的目的是返回有关执行代码的计算机上的驱动器的信息。

如果您想传递这些数据,那么您可以随时创建自己的类并对其进行序列化。

【讨论】:

谢谢,这解释了一切。所以包装器是我唯一的方法。

以上是关于使用json时为啥转不了net.sf.ezmorph.bean.morphdynabean cannot be cast to ja的主要内容,如果未能解决你的问题,请参考以下文章

Java对象转JSON时如何动态的增删改查属性

myEclipse工具JAVA程序,原本按住Ctrl再点击某个函数不能跳转为啥?

为啥在解析json中汉字解析不了

powerbi数字为啥转不了日期

为啥迅游官网的充值页面和登陆页面总是跳转不了?我浏览器看别的网页都很正常都能正常登陆和跳转。

jsonobject接受不了数组吗