如何使用JSON .NET序列化此对象?

时间:2017-11-12 00:18:07

标签: c#-4.0 json.net

我有以下对象要将其序列化为JSON字符串:

public class Zone
{
    public string id;
    public string name;
    public Size size;
    public Point offset;
    public List<Label> zoneLabels;
}

我可以在添加之前使用以下内容:

 public List<Label> zoneLabels;
 string json;
 json = JsonConvert.SerializeObject(zn);

当我添加:

 public List<Label> zoneLabels;

并运行json = JsonConvert.SerializeObject(zn); 我收到以下错误:

  

{“为类型的属性'所有者'检测到自引用循环   'System.Windows.Forms.Label'。路径   'zoneLabels [0] .AccessibilityObject'。“}

基本上我的Zone对象包含一些显示的属性和一个Label控件列表。我需要将其序列化为JSON字符串并稍后恢复到相同的Zone对象(DeserializeObject to Zone)。我需要做些什么呢?

2 个答案:

答案 0 :(得分:0)

您可以在序列化对象时使用Newtonsoft.Json.ReferenceLoopHandling.Ignore

json = JsonConvert.SerializeObject(zn, Formatting.Indented,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    }
);

您可以根据需要使用ReferenceLoopHandling的其他枚举。

由于OP评论说在使用上面的代码之后,OP正在获得Stackoverflow异常,这是由于Label无限期嵌套造成的。因此,在这种情况下,您可以使用PreserveReferencesHandling.Objects

json = JsonConvert.SerializeObject(zn, Formatting.Indented, 
new JsonSerializerSettings()
{ 
        PreserveReferencesHandling = PreserveReferencesHandling.Objects
});

答案 1 :(得分:0)

经过一些研究和其他回复,我发现可能处理这个问题的最好办法是制作你自己的标签对象,例如:

public class Zone
{
    public string id;
    public string name;
    public Size size;
    public Point offset;
    public List<ZoneLabels> zoneLabels;
}


public class ZoneLabels
{
    public string text;
    public string name;
    public Point location;
}

然后,您可以使用JSON.NET

轻松执行以下操作以序列化为JSON字符串
List<ZoneLabels> labels_list = new List<ZoneLabels>();
foreach (Label zl in znLabels)
{
    labels_list.Add(new ZoneLabels { name = zl.Name, text = zl.Text, location = zl.Location });
}

Zone zn = new Zone();
zn.name = "Zone";
zn.size = new Size(464, 128);
zn.offset = new Point(x, y);
zn.id = id_new;
zn.zoneLabels = labels_list;

//serialize the object to a JSON string
string json = JsonConvert.SerializeObject(zn);

这将生成一个JSON字符串,该字符串将反序列化为Zone对象。

在我的情况下,我只设置了Label的一些属性,但即使你需要设置几个Control对象属性,这也许是处理将Form Control对象列表序列化为JSON字符串的最简单方法之一。