我有以下对象要将其序列化为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)。我需要做些什么呢?
答案 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字符串的最简单方法之一。