在阅读一些有关克隆对象的文献时,我碰到了这个短语
“如果您的对象开箱即用,JSON可序列化”
有人可以解释一下吗?
最好使用一些相反的示例(n对象不是开箱即用的JSON可序列化的情况)
参考方案
首先想到的是循环依赖。
假设我们有一个类,其中的一个字段引用其子级,而子类中的一个字段引用其父级。
public class A
{
public B Child;
}
public class B
{
public A Parent;
}
public class Program
{
private static void Main()
{
A a = new A();
B b = new B();
a.Child = b;
b.Parent = a;
string json = JsonConvert.SerializeObject(a);
}
}
这将导致在JsonSerializationException
的运行时JsonConvert.SerializeObject(a)
出现以下消息:
Self referencing loop detected for property 'Parent' with type 'A'. Path 'Child'.
为避免这种情况,JSON.NET提供了SerializeObject
的重载来传递设置对象,在这里我们可以指定如何处理循环引用。
JsonSerializerSettings settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.None,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
JsonConvert.SerializeObject(a, settings);
这样,输出json将完全忽略从子级到父级的循环引用,它看起来像这样:
{
"Child": {}
}
JSON.NET还提供了一种在不丢失信息的情况下进行处理的方法。我们需要在设置中指定选项PreserveReferencesHandling.Objects
。
JsonSerializerSettings settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects
};
输出JSON只能由JSON.NET或与$id
和$ref
语法兼容的其他序列化器解释,并且看起来像这样:
{
"$id":"1",
"Child": {
"$id":"2",
"Parent": {
"$ref":"1"
}
}
}
JSON PATH字段NULL检查表达式 - java我有一个像bellow的json数组:{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sa…
json_encode网址失败 - php有人在this bug附近吗?echo json_encode(array('url'=>'/foo/bar')); {"url":"\/foo\/bar"} 我使用Zend_Json and Zend_Json_Expr以便我甚至可以在js对象中获取回调函数-但我无法获得…
json.dumps弄乱顺序 - python我正在使用json module创建一个包含类似条目的json文件json.dumps({"fields": { "name": "%s", "city": "%s", "status": "%s", "cou…
如何在没有for循环的情况下在Javascript中使用Django模板标签 - javascript我想在JavaScript中使用模板变量:我的问题是在javascript代码中使用for循环,for循环之间的所有事情都会重复..但我不想要....下面粘贴了我的代码..有人可以告诉我更好的方法吗这..因为这看起来很丑..这是我的代码: {% block extra_javascript %} <script src="/static/js…
JSON SCHEMA PATTERN逗号分隔列表 - python我的json模式中具有以下模式,并且我需要根据以下模式包含逗号分隔的值。当前模式只能像DV2一样处理一种模式所以我应该如何修改我的模式以包括多个字符串,如下所示,但它应该与声明的模式匹配。例如:“ DV2”,“ DEV1”,“ DEV3”,“ ST”, "ENVIRONMENT": { "type": "st…