我正在为项目使用Typescript,需要将集合序列化为json,将其保存到文件中,然后将该文件反序列化为类似的集合。该集合看起来像:
elements: Array<tool>
我的工具界面如下所示:
export interface tool {
name: string;
draw(context:any);
}
工具实现如下所示:
export class textTool implements tool {
name: string;
fontSize:number;
fontType:string;
draw(context:any){
// draws the control...
}
}
我有一些工具界面的实现:textTool,imageTool和rectangleTool。我需要解决的问题是,当我将文件内容反序列化为工具集合时,我只会得到一个常规对象,而不是例如textTool的实例。
我JSON.stringify(elements)
用来创建一个json并JSON.parse(jsonText)
反序列化。
我知道解析器无法知道应该创建哪种类型的实例,因为json文本没有相关信息。我想添加一个字段或一些东西来标识我需要哪个类实例,然后手动“新建”该类。我不需要手动将json解析为工具集合(具有正确类型)的任何选项?
如您所说,您可以添加一个字段type
,在类型字符串到实现类之间创建一个映射,然后转换代码将非常简单:
export interface tool {
type: string;
name: string;
draw(context:any): void;
}
class textTool implements tool {
type:string = 'textTool';
name:string;
fontSize:number;
fontType:string;
draw(context:any):void {
}
}
const typeMapping:any = {
'textTool' : textTool
//all other types
};
let json = '[{"type":"textTool", "name": "someName", "fontSize": 11}]';
let elements: Array<tool> = JSON.parse(json).map((i:any) => {
let target:any = new typeMapping[i.type];
for (const key in i) {
target[key] = i[key];
}
return target;
});
*克隆代码非常简单,但是对于普通对象来说已经足够了。
问题内容: 我有一些奇怪的JSON,如: 基于某个字段,数组中的对象是某种类型。使用Gson,我的想法是要拥有一个TypeAdapterFactory,它将那些特定类型的委托适配器发送到TypeAdapter,但是我一直挂在理解读取“ type”字段以了解要创建哪种类型的一种好方法上。在TypeAdapter中 会假设“类型”字段在我的JSON中排在首位。有消除这种假设的不错方法吗? 问题答案:
问题内容: 我在这里发现了同样的问题… …但是没有正确的答案。 最好的建议之一是将嵌套对象包装到新类中,但是这种方法引入了另一个问题:乐高名称。 在我的示例中,此类的最逻辑名称是与父类相同的名称,当然这是不可能的。我的示例很简单,我只想消除父类中的“语言”属性。有人可以帮我做吗? json的示例: 问题答案: 如果JSON属性名称与c#命名约定冲突,则可以在序列化期间使用或批注替换其他名称。 例如
我有一个通过RabbitMQ作为消息发送的类,在sender服务上,它的定义如下: 并且在接收方服务上: 在receiver controller中,我有以下方法,它应该接受该消息,将其转换为一个对象,并将其保存在数据库中,看起来如下所示: 编辑:根据请求添加堆栈跟踪。
问题内容: 我有一个叫做抽象类,然后两个是实现,和。我遇到的问题是,当我将a的其余端点调用到数据库中时,理想情况下,我希望它像将实例传递给REST端点的位置一样。如果不是用一个以上的实现来抽象,那就没问题了,但是由于我有2个,所以我得到了一个错误。 “问题:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么被其他类型信息实例化” 在找到解决方案之后,我找到了一个SO答案,说我可以使用类
问题内容: 我正在尝试将json数据反序列化为模型类,但是失败了。这是我的工作: 这是我的模型的样子: 您可以看到我到达这里的Json:http : //api.worldbank.org/incomeLevels/LIC/countries? format=json 这是我得到的错误: 无法将JSON数组反序列化为“ Mvc4AsyncSample.Models.CountryModel”类型。
问题内容: 我正在针对返回JSON数据的第三方API进行编程,但是格式可能有点奇怪。某些属性可以是一个对象(包含一个Id属性),也可以是一个字符串(它是该对象的ID)。例如,以下两个都是有效的: 和 我正在尝试使用JSON.net将其反序列化为强类型类,但到目前为止运气还不足。我最好的主意是将其序列化为两个属性,一个为字符串,另一个为对象,并为每个属性使用自定义JsonConverter以允许变量