在 CANoe 中使用无效的 C# 标识符反序列化 JSON

分享于2022年07月17日 c# canoe 问答
【问题标题】:在 CANoe 中使用无效的 C# 标识符反序列化 JSON(Deserializing JSON with invalid C# identifier in CANoe)
【发布时间】:2022-07-09 23:08:14
【问题描述】:

我遇到了无法反序列化收到的 JSON 的问题。示例 JSON:

{
    "header": {
        "product-type" : "product/electronics"
    }
}

应该被解析的对象被命名为“product-type”并且是一个无效的 C# 标识符。在 C# 中处理这个很容易。但我面临的问题是在 CANoe 软件中处理这个问题。目前,我接收此 JSON 的方式是创建一个具有 MQTT 绑定和 JSON 序列化类型的对象。我为其分配了一个用户定义的数据类型,其中包含的成员具有与要接收的预期 JSON 相同的标识符。

这里出现了问题,因为我必须将成员的名称声明为产品类型,而这里的连字符使其无效。请注意,这是在 CANoe 软件中,而不是在独立的 C# 程序中。

四处搜索,我发现可以在标识符之前添加一个名为 JsonProperty 的东西,以 重命名 JSON 名称到任何其他标识符名称。但我意识到这只能在 C# 中完成,因为这样的属性不能通过 vCDL 代码获得。

我正在考虑使用可用的普通序列化选项。但是阅读 CANoe Vector 中的帮助文档会发现这只是用于序列化而不是反序列化。

感谢您为接收 JSON 数据所做的任何工作。如果需要任何额外信息,请发表评论。


【解决方案1】:

vCDL 代码中将有一个类似于 JsonProperty 的功能,在未来的下一个 CANoe 版本/服务包中。

在这种情况下,您可以很好地使用您提到的普通序列化。它应该非常适合反序列化。您可以在 vCDL 中定义“字符串”类型(或“字节”类型,纯序列化仅适用于这两种数据类型)DO 成员(例如:[Serialization="Plain"] 消费数据字符串 myreceiver;)。然后,您可以使用像 Newtonsoft JSON 这样的包来反序列化 C# 应用程序模型中的数据。您还可以使用用 Python 编写的应用程序模型来反序列化您的 JSON 字符串,因为我认为 Python 具有内置的 JSON 支持。

如果您想在 CANoe 的图形或跟踪窗口中可视化反序列化 JSON 字符串的某些成员,您可以为此目的在 vCDL 中定义内部 DO 成员(内部数据字符串 mytracewindowvisualizer;或内部数据 int mygraphicswindowvisualizer;)和使用相应的 JSON 成员数据更新它们。