Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 双链表到JSON_C#_Json_Data Structures_Json.net_Doubly Linked List - Fatal编程技术网

C# 双链表到JSON

C# 双链表到JSON,c#,json,data-structures,json.net,doubly-linked-list,C#,Json,Data Structures,Json.net,Doubly Linked List,我有一个三维结构。。。实际上是一个具有六个节点的双链接列表,即左、右、上、下、内、外。如果一个节点位于另一个节点的右侧,则该节点将位于第一个节点的左侧。像 实际上这是一个3D结构,但为了理解,我给出了一个2D示例。 现在我必须将其转换为JSON格式,通过WCF将数据发送到客户端,但由于它包含循环,因此无法转换为JSON。我有这些问题 这种类型的双链接列表可以转换为JSON吗 还有别的办法吗 还有其他推荐的数据结构吗?如果这是不可能的使用双链表 我正在使用它来处理JSON 我的班级是 publi

我有一个三维结构。。。实际上是一个具有六个节点的双链接列表,即左、右、上、下、内、外。如果一个节点位于另一个节点的右侧,则该节点将位于第一个节点的左侧。像

实际上这是一个3D结构,但为了理解,我给出了一个2D示例。 现在我必须将其转换为JSON格式,通过WCF将数据发送到客户端,但由于它包含循环,因此无法转换为JSON。我有这些问题

  • 这种类型的双链接列表可以转换为JSON吗
  • 还有别的办法吗
  • 还有其他推荐的数据结构吗?如果这是不可能的使用双链表 我正在使用它来处理JSON

    我的班级是

    public class Node
    {
        public Document document = null;
    
        public Node left = null;
        public Node right = null;
        public Node up = null;
        public Node down = null;
        public Node inside = null;
        public Node outside = null;
    }
    

    如果您在设置中设置
    preserverencesshandling
    选项,Json.Net可以处理引用循环

    JsonSerializerSettings settings = new JsonSerializerSettings
    {
        PreserveReferencesHandling = PreserveReferencesHandling.Objects,
        Formatting = Formatting.Indented
    };
    string json = JsonConvert.SerializeObject(rootNode, settings);
    
    此设置将使用特殊的
    $id
    $ref
    属性编写JSON,这些属性允许将JSON反序列化回原始引用,假设您在客户端使用JSON.Net进行反序列化。有了它,您应该能够毫无问题地使用现有的对象结构

    演示:


    在这里工作:你拥有的是一个网络。其中一种表示是边列表。你的都是双向的,看起来是这样的:

    [
        {source:"Left Node", destination:"Center Node"},
        {source:"Center Node", destination:"Up Node"},
        {source:"Center Node", destination:"Down Node"},
        {source:"Center Node", destination:"Right Node"},
        ...
    ]
    
    [{id=0, left=1,right=2,up=3,down=null,in=4,out=5},
    {id=1, left=6, right=0, up=7, down=null, in=8, out=9},
    ...]
    
    您可以使用网络遍历来吐出Json。具体算法取决于您拥有的特定网络。然而,在网络上搜索应该会提供您所需要的所有示例代码

    双链表当然不是您所需要的,除非您有一个非常特定的网络,可以使用每个边按顺序遍历一次

    另一种可能是,您实际上只是在处理体素。也就是说,所有节点都只是三维立方体中的坐标。一个体素与另一个体素相邻这一事实意味着存在连接。所以,如果左节点在,而中心节点在,则存在一个连接,因为所有坐标都相同,除了Y,它只相差1。存储只是现有节点的列表

    您的问题提到了一个3D结构,所以如果节点都位于特定距离,则似乎存在体素表示。相反,如果距离是随机的,则需要走网络路线。

    任何3D阵列(或任何尺寸的阵列)本质上都是1D阵列。您甚至可以认为所有数组都是一维的,因为二维数组可以(逻辑上)解释为数组数组数组,三维数组是数组数组数组数组,依此类推

    如果你的结构像一个立方体,那么它只是一个3D阵列。它是否存储在链接列表中并不重要。所以要做到这一点,只需抓取一个角(比如左下角),然后逐行、逐平面地遍历结构,并将对象存储到一维(或三维)阵列中。在另一端以相同的方式构造它

    您的序列化看起来像这样(其中(x,y,z)是每个节点的内容)

    如果结构具有任意三维形状,请任意拾取任何节点,然后将其余节点视为树结构。每个元素最多可以有6个子节点。假设选择“中心节点”,首先描述它有哪些子节点,然后再描述子节点的子节点(如果有的话)。为每个节点指定一个唯一的ID以区分它们。在描述节点的子节点之前,将节点描述为子节点非常重要,否则无法在另一端构造它

    您的结构如下所示:

    [
        {source:"Left Node", destination:"Center Node"},
        {source:"Center Node", destination:"Up Node"},
        {source:"Center Node", destination:"Down Node"},
        {source:"Center Node", destination:"Right Node"},
        ...
    ]
    
    [{id=0, left=1,right=2,up=3,down=null,in=4,out=5},
    {id=1, left=6, right=0, up=7, down=null, in=8, out=9},
    ...]
    

    如果愿意,您可以安全地忽略链接列表中的任何双向信息,因为第二种方式是多余的。

    您可以为每个节点指定一个ID,并使用它来序列化/反序列化节点:
    [{ID=0,Right=1},{ID=1,Left=0}]
    。类似的选择是有一个节点集合和一个顶点集合(如果连接是无向的,这可能更好)。你的意思是我应该选择图形数据结构?你已经有一个有限的图形数据结构(
    Node
    是你的术语)。这取决于您如何表示它-数据是相同的数据。(例如,你也可以使用一个3D数组,但根本没有边)确切地说,你是对的,兄弟,这是一个有6条无向边的图。。。3D数组是我的第一个首选,但问题是我必须从中间开始填充数据,然后移向角落。是的,你说得对。这些是3D立方体中的坐标,我必须在每次迭代中访问最接近的节点,然后移离中心@DirkBester好的,那么如果你需要以这种方式访问,你需要实现为一个网络,并从距离中心最近的节点开始进行广度优先遍历。你知道它是否可以反序列化这个特殊的JSON回到内存中的对象并保留引用吗?@Matt Yes。如果您不相信,我创建了一个,它创建一些节点,用循环引用链接它们,转储对象关系,将结构序列化为JSON,并将
    PreserveReferencesHandling
    设置为
    Objects
    ,将JSON反序列化回对象,最后转储反序列化结构的对象关系。您可以看到,引用确实被保留了下来。
    [{id=0, left=1,right=2,up=3,down=null,in=4,out=5},
    {id=1, left=6, right=0, up=7, down=null, in=8, out=9},
    ...]