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”是指int , double还是string类型。
请注意,当您使用DynamicEntity时,您不会遇到同样的问题,因为运行时允许以类似于JavaScript的方式进行解释。
这篇关于动态和静态匿名类型如何对待反序列化的文章有点旧,但仍然相关。 他们的方法是使用JsonConvert.DeserializeAnonymousType()
- 一种动态方法 - 返回匿名。
本文扩展了Web Api的DataContractJsonSerializer
,以及它如何使用匿名类型来限制您的选择。 建议的答案是
“替换MediaTypeFormatter并插入我们自己的JSON序列化程序”
这对于您的有限需求而言意味着很多工作。
你会发现,在使用Linq投影之后,你的DynamicEntity可能是你找到的最好的方法。
您是否尝试编写JsonConverter并将其注册到您的ValueProviderFactory中。
JSONSerializer.Converters.Add(new DynamicEntityObjectConverter());
在你的转换器里你可以JsonConverter.Deserialize<EntityType>(json)
使用JsonConverter.Deserialize<EntityType>(json)
,它可以用于循环引用。
上一篇: Json.net deserialize json with circular reference in MVC4