gpt4 book ai didi

c# - Json.net 在 MVC4 中使用循环引用反序列化 json

转载 作者:太空狗 更新时间:2023-10-29 20:33:45 25 4
gpt4 key购买 nike

我正在尝试使用循环引用反序列化对象图,但没有成功,

Json.net 在序列化循环引用时效果很好:向对象添加一个 $id 并用 $ref = *objectId 替换对象,当我将相同的数据发送回 MVC 操作时,它不会正确反序列化 - 用空对象替换 $refs。

我使用 json.net 进行序列化和反序列化,反序列化是在自定义 IValueProvider 中实现的 - https://json.codeplex.com/discussions/347099

我注意到在反序列化为匿名对象时

JsonConverter.Deserialize(json);

它不会处理循环引用。但是当使用通用类型反序列化时

JsonConverter.Deserialize<EntityType>(json) 

它将正确反序列化。

但是我在 GetValueProvider(ControllerContext controllerContext) 中找不到类型

任何帮助将不胜感激

编辑-在我当前的修复中,我将整个 json 作为字符串传递并使用

JsonConverter.Deserialize<EntityType>(json) 

在 Controller 的操作中使用正确的类型,但这绝对不是使用 json + mvc4 的正确方法...我需要一个更好的方法将它集成到 mvc 中,开始赏金

编辑-更多代码类型:

[JsonObject(IsReference = true)]
public class DynamicEntity : EntityWithID<Guid>
{
....

public virtual IList<DynamicEntity> ReferenceFields { get; set; }
}

要反序列化的json是Json.net的Serialize方法的输出。

{"$id":"1","ReferenceFields":[{"$ref":"1"}],"Id":"9f9de7f3-865e-4511-aeac-a2ff01193b06"}

问题在于与 MVC 的集成,因为 json 在服务器和客户端之间来回传递。我已经有了 js 方法来将它来回更改为完全相同的格式 - 测试我现在这样使用它:

public ActionResult EntitySaveOrUpdate(string entity)
{
var entityToSave = JsonConvert.DeserializeObject<DynamicEntity>(entity);
...
}

它工作得很好,但我需要与 MVC 更好地集成,而不是在我的所有操作中反序列化...

最佳答案

The challenge is dynamically typing at compile-time an un-typed languages (JSON).

因为 JSON 实际上是 Java-Script Object Notation,而 JavaScript 是弱类型(或非类型),编译时解释器不确定“1”是否指代 int,< strong>doublestring 类型。

请注意,当您使用 DynamicEntity 时,您不会遇到同样的问题,因为允许运行时以类似于 的方式解释em>JavaScript

  • This post关于动态和静态匿名类型如何处理反序列化的说法有点陈旧,但仍然相关。他们的方法是使用 JsonConvert.DeserializeAnonymousType()(一种动态方法)来返回匿名。

  • This post扩展了 Web ApiDataContractJsonSerializer,以及它如何限制您使用匿名类型的选项。建议的答案是

"to replace the MediaTypeFormatter and plug in our own JSON serializer"

对于您有限的需求,这需要做大量工作。

您会发现,如果不使用 Linq 投影,您的 DynamicEntity 可能一样好您会发现这种方法。

关于c# - Json.net 在 MVC4 中使用循环引用反序列化 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744411/

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