序列化嵌套对象(列表)

时间:2014-12-10 06:07:45

标签: c# entity-framework

我正在尝试序列化课程数据。我得到课程ID(C_id)和课程名称(C_Name)。我还有一件事是学生的Icoolection。当我尝试序列化时,我无法获得已注册该课程的学生的嵌套列表。

var u = (from g in t.courses 
         select g)
        .ToList();

List<course> ui = u
    .Select(d => new course() 
        { C_Name = d.C_Name, 
          C_Id = d.C_Id, 
          student = d.student 
        })
    .ToList();

ASCIIEncoding objASCIIEncoding = new ASCIIEncoding();

string strData = JsonConvert
    .SerializeObject(ui, Formatting.Indented, new JsonSerializerSettings()
{
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});

在上面的代码中,我正在使用嵌套的students列表获取正确的数据,但是这行

string strData = JsonConvert.SerializeObject(ui, Formatting.Indented, new JsonSerializerSettings()
{
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});

执行我只获得课程ID(C_ID)和课程名称(C_Name)。嵌套的student列表未序列化。

2 个答案:

答案 0 :(得分:0)

来自文档:

  

Json.NET将忽略引用循环中的对象而不是序列化   他们。第一次遇到对象时,它将被序列化为   通常但如果对象是作为自身的子对象遇到的   序列化器将跳过序列化。

http://james.newtonking.com/json/help/index.html?topic=html/SerializationSettings.htm

我假设您的学生包含对他们课程的引用?也许你应该确保他们不要做类似下面的事情来删除对课程的引用:

student = d.student.Select(s => new {s.studentId, s.studentName}).ToList()

答案 1 :(得分:0)

希望这有助于http://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm

JsonSerializer上的PreserveReferencesHandling设置将更改所有对象的序列化和反序列化方式。对于应该将哪些对象和成员序列化为引用的细粒度控制,JsonObjectAttribute,JsonArrayAttribute和JsonPropertyAttribute上有IsReference属性。 将JsonObjectAttribute或JsonArrayAttribute上的IsReference设置为true将意味着JsonSerializer将始终序列化该属性所针对的类型作为引用。将JsonPropertyAttribute上的IsReference设置为true将仅将该属性序列化为引用。

[JsonObject(IsReference = true)]
public class EmployeeReference
{
    public string Name { get; set; }
    public EmployeeReference Manager { get; set; }
}