当c#对象不是JSON可序列化的 - c#

在阅读一些有关克隆对象的文献时,我碰到了这个短语

“如果您的对象开箱即用,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…