gpt4 book ai didi

java - 如何使 Jackson 和 JSON.net 的引用处理语法兼容?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:27 27 4
gpt4 key购买 nike

我有一个服务器可以使用 Jackson 生成以下 JSON。

{
"$id" : 1,
"employees" : [
{
"$id" : 2,
"name" : "John Rambo",
},
2 // Jackson: reference by ID only
]
}

员工列表包含两次相同的员工。 Jackson 第二次通过其 ID 正确引用了该对象。

我想在使用 JSON.net 的客户端中对此进行反序列化,但这行不通,因为 JSON.net 希望我将引用包装在具有 $ref 属性的 json 对象中,如下所示:

{
"$id": "1",
"employees" : [
{
"$id": "2",
"name": "John Rambo"
},
{
"$ref": "2" // JSON.net: reference wrapped in JSON object
}
]
}

有没有办法通过配置或实现自定义反序列化器使 JSON.net 正确使用 Jackson 语法?

最佳答案

这是一个应该可以工作的自定义转换器:

public class EmployeeConverter : JsonConverter
{
public override void WriteJson(
JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
List<Employee> employees = null;

if (reader.TokenType == JsonToken.StartArray)
{
JArray arr = serializer.Deserialize<JArray>(reader);

employees = new List<Employee>(arr.Count);

var employeeMap = new Dictionary<int, Employee>();

foreach (var item in arr)
{
if (item.Type == JTokenType.Object)
{
var employee = item.ToObject<Employee>();
employees.Add(employee);

int id = item["$id"].ToObject<int>();
employeeMap.Add(id, employee);
}
else if (item.Type == JTokenType.Integer)
{
Employee employee = null;

int id = item.ToObject<int>();

if (employeeMap.TryGetValue(id, out employee))
{
employees.Add(employee);
}
}
}
}

return employees;
}

public override bool CanRead
{
get { return true; }
}

public override bool CanConvert(Type objectType)
{
return false;
}
}

... 下面是您将如何使用它:

public class Company
{
public Company()
{
this.Employees = new List<Employee>();
}

[JsonConverter(typeof(EmployeeConverter))]
public List<Employee> Employees { get; set; }
}

示例: https://dotnetfiddle.net/XooyQC

基本上使用自定义转换器反序列化整个数组。首先,将数组反序列化为 JArray,然后检查 JArray 的每个元素以查看它是引用还是新对象。

关于java - 如何使 Jackson 和 JSON.net 的引用处理语法兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491595/

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