Json.net反序列化MVC4中的循环引用json

我试图用循环引用反序列化对象图,

Json.net在序列化循环引用时运行良好:向对象添加$ id并用$ ref = * objectId替换对象,当我将相同的数据发送回MVC动作时,它不会正确反序列化 - 用$替换空的物体。

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

我注意到,当反序列化到一个匿名对象

JsonConverter.Deserialize(json);

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

JsonConverter.Deserialize<EntityType>(json) 

它会正确地反序列化。

但我找不到GetValueProvider(ControllerContext controllerContext)中的类型,

任何帮助将不胜感激

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

JsonConverter.Deserialize<EntityType>(json) 

在控制器的动作中使用正确的类型,但这绝对不是使用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脚本对象表示法 ,而JavaScript是弱类型的(或非类型化的),因此编译时解释器不确定“1”是指intdouble还是string类型。

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

  • 这篇关于动态和静态匿名类型如何对待反序列化的文章有点旧,但仍然相关。 他们的方法是使用JsonConvert.DeserializeAnonymousType() - 一种动态方法 - 返回匿名。

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

  • “替换MediaTypeFormatter并插入我们自己的JSON序列化程序”

    这对于您的有限需求而言意味着很多工作。

    你会发现,在使用Linq投影之后,你的DynamicEntity可能是你找到的最好的方法。


    您是否尝试编写JsonConverter并将其注册到您的ValueProviderFactory中。

    JSONSerializer.Converters.Add(new DynamicEntityObjectConverter());
    

    在你的转换器里你可以JsonConverter.Deserialize<EntityType>(json)使用JsonConverter.Deserialize<EntityType>(json) ,它可以用于循环引用。

    链接地址: http://www.djcxy.com/p/19669.html

    上一篇: Json.net deserialize json with circular reference in MVC4

    下一篇: Can't install pycurl with pip