JSon异常自引用循环

时间:2017-04-14 08:25:20

标签: c# json rabbitmq masstransit

我正在使用Mass Transit发送消息。

public class Node
{
    public Node Parent;
    public string Name;
    public List<Node> Nodes = new List<Node>();
}

public class Portfolio : MessageBase
{
    public string Name;
    public List<Node> Nodes = new List<Node>();
}
public class TreeUpdateRequest:MessageBase
{
    // just request
}

public class TreeUpdateResponse : MessageBase
{
    public Portfolio Portfolios;
}

我正在发送树形结构。

public async Task Consume(ConsumeContext<TreeRequest> context)
        {

// build tree

            context.Respond(TreeResponse);
        }

我有例外。

MassTransit.RabbitMqTransport.Transport.RabbitMqSendTransport Error: 0 : Send Fault: rabbitmq://vip-mnapptst-01/Dimon/bus-ZHUKOV16-MangoAppService.vshost-dyuyyynjq3sxywr8bdkegdq5fc?durable=false&autodelete=true, System.Runtime.Serialization.SerializationException: Failed to serialize message ---> Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'parent' with type 'Open.Mango.Messages.Orc.Node'. Path 'message.portfolios.nodes[14]'.
   at er jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at MassTransit.Serialization.JsonMessageSerializer.Serialize[T](Stream stream, SendContext`1 context)

我试图检查树节点是否正在引用自己

a->a

但实际数据没有这些

我认为图中有一些循环,如

A-&GT; A1-&GT; .. AN-&gt;一种  有什么建议吗?

1 个答案:

答案 0 :(得分:4)

这绝对是一个循环。您可以通过以下方式重现:

var parent = new Node(); 
parent.Parent = parent; 
var failsHere= Newtonsoft.Json.JsonConvert.SerializeObject(parent);

你可以告诉Newtonsoft忽略循环处理。不确定RabbitMq是否可以输入JsonSetting对象,但您可以将全局Json设置定义为默认值,并告诉它在RabbitMq调用之前忽略循环处理。

Newtonsoft.Json.JsonConvert.DefaultSettings = () => 
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    };