gpt4 book ai didi

java - 如何在 C# 中反序列化 JAVA 程序使用 jackson 发送的 JSON 对象?

转载 作者:行者123 更新时间:2023-11-30 10:50:19 25 4
gpt4 key购买 nike

我正在从事一个需要 .NET 程序和 JAVA 程序通过协议(protocol)进行互操作的项目。

JAVA 端使用 Jackson 序列化简单的 JAVA 对象(导致 JSON-Packets 将具体类作为@class 成员)。

但是 .NET 端对此使用不同的约定 - 此处的类型由 __type 成员指定。

我可以修改 .NET 端以接受 JACKSON 格式的数据包吗?在 JAVA 端更改协议(protocol)格式不是最佳选择,因为该协议(protocol)已在其他地方使用,因此最好让 .NET 适应。

目前我正在查看 .NET DataContractJsonSerializer - 但如果需要,也可以在 .NET 端使用第三方库。

JSON.NET 能否提供这种灵 active ?顺便说一句,汇编版本之类的问题在这里不是问题,因此协议(protocol)发送该信息是完全可以的。

编辑让我的意图更清楚,这里有一些示例代码:

JAVA端

package some.pkg;

import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS)public abstract class EventBase {

public final String superField;

protected EventBase(final String superField) {
this.superField = superField;
}
}

第二个JAVA包类

package some.pkg;

public final class EventA extends EventBase {

public final int intFieldA;

public EventA(final int intFieldA, final String superField) {
super(superField);
this.intFieldA = intFieldA;
}

private EventA() {this(0,null);}//for jackson
}

Jackson 生成的 JSON

Jackson 生成的 JSON 字符串看起来像喜欢

{
"@class" : "some.pkg.EventA",
"superField" : "S1",
"intFieldA" : 1
}

.NET

这里我有等效的类(这里没有显示方法 - 这是一个请求/事件协议(protocol),请求方法存储在数据包本身中。

所以在这里我期待类似的东西

namespace some.pkg
{
public sealed class EventA extends EventBase {

public EventA(final int intFieldA, final String superField) : base(superField) {
this.intFieldA=intFieldA;
}

[DataMember]
public int fieldA { get; private set; }
}

... EventBase 的父类(super class)和其他子类。

对我而言,这里的问题是 Jackson 通过 @c 或 @class 向类发送信号的方式与 Microsoft 的标准“__type”属性或 JSON.NET 的“$type”相对。

已编辑 - 摘要

好的,在 resp 之前切换 $type 和 @class 的答案。在 .NET 序列化程序完成后,它确实可以很好地工作(只要神奇的字符串 @class 和 $type 没有在其他地方用作有效负载数据)。

查看 JSON.NET 的源代码后,我发现 $type descriminator 字段是一个常量字符串,因此更改它需要我们使用经过修补的 JSON.NET 库,这看起来比仅仅更改有问题的字符串更有效分别之前在 JsonReader/Writer 类完成他们的行为之后。

最佳答案

我不太确定转换 JSON.NET 的默认命名约定。但如果我是你,我会使用如下所示的“JSON 拦截器”函数

public static class JSONInterceptor {
public static string sanitizeJSON(string originalJSONFromJava)
{
//add any other validation checks here as you may see fit. ex: null checks
return originalJSONFromJava.replace("@class", "$type");
}
}

然后使用它生成如下所示的 .NET 类

return JsonConvert.DeserializeObject<EventA>(JSONInterceptor.sanitizeJSON(originalJSONFromJava));

我自己还没有尝试过。但我的想法是向您展示这也可以通过以下方式完成

关于java - 如何在 C# 中反序列化 JAVA 程序使用 jackson 发送的 JSON 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35128847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com