Linq转型需要帮助

时间:2016-10-27 15:23:28

标签: c# json linq

我有一个这个对象的列表:

public class WebinarAttendeesList {
    public int wa_id { get; set; }
    public int PID { get; set; }
    public string FullName { get; set; }
    public string Email { get; set; }
    public string JoinTime { get; set; }
    public string TimeInSession { get; set; }
    public string LeaveTime { get; set; }
    public int FirstPollCount { get; set; }
    public int SecondPollCount { get; set; }
    public int AttendedWebinar { get; set; }
    public int Makeup { get; set; }
    public string Comments { get; set; }
    public string RegistrantKey { get; set; }
    public string webinarKey { get; set; }
}

我正在使用此Linq代码:

var webinars = new
{
    Webinars = r.GroupBy(x => new { x.PID, x.FullName }).
    Select(y => new
    {
        PID = y.Key.PID,
        FullName = y.Key.FullName,
        AffReceived = 0,
        Attendances = y.Select(z => new
        {
            WebinarKey = z.webinarKey,
            RegistrantKey = z.RegistrantKey,
            TimeInSession = z.TimeInSession,
            FirstPollCount = z.FirstPollCount,
            SecondPollCount = z.SecondPollCount,
            AttendedWebinar = z.AttendedWebinar
        })
    })
};
string json = JsonConvert.SerializeObject(webinars);

将List转换为JSON。但是,我认为我更愿意 将它转换为List<FinalWebinarAttendeesList>(见下文 定义)。它生成的JSON看起来正确并传递lint。

当我尝试这样做时:

List<FinalWebinarAttendeesList> fl = JsonConvert.DeserializeObject<List<FinalWebinarAttendeesList>>(json);

我收到错误:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type
'System.Collections.Generic.List`1[WebinarProject.Models.FinalWebinarAttendeesList]' 
because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or 
change the deserialized type so that it is a normal .NET type (e.g. not a 
primitive type like integer, not a collection type like an array or List<T>) 
that can be deserialized from a JSON object. JsonObjectAttribute can also be 
added to the type to force it to deserialize from a JSON object. Path 
'Webinars', line 1, position 12.

如何直接将其转换为我想要的对象,或者能够将其反序列化为我想要的对象?

FinalWebinarAttendeesList定义:

public class FinalWebinarAttendeesList
{
    public FinalWebinar Webinars {get; set; }
}
public class FinalWebinar
{
    public int PtID { get; set; }
    public string FullName { get; set; }
    public int AffReceived  { get; set; }
    public List<FinalWebinarAttendee> Attendances { get; set; }

}
public class FinalWebinarAttendee
{
    public string RegistrantKey { get; set; }
    public string TimeInSession { get; set; }
    public int FirstPollCount { get; set; }
    public int SecondPollCount { get; set; }
    public int AttendedWebinar { get; set; }

}

2 个答案:

答案 0 :(得分:1)

我使用随机数据创建了一个json示例输出,并且我发现您正在尝试使用错误的对象反序列化json。 Json输出:

{"Webinars":[{"PID":453,"FullName":"jdis","Attendances":[{"WebinarKey":"kdnsaod","RegistrantKey":"udhaso","TimeInSession":"hdija","FirstPollCount":45,"SecondPollCount":45,"AttendedWebinar":0}]}]}

该对象具有以下结构:

public class Attendance
{
    public string WebinarKey { get; set; }
    public string RegistrantKey { get; set; }
    public string TimeInSession { get; set; }
    public int FirstPollCount { get; set; }
    public int SecondPollCount { get; set; }
    public int AttendedWebinar { get; set; }
}

public class Webinar
{
    public int PID { get; set; }
    public string FullName { get; set; }
    public List<Attendance> Attendances { get; set; }
}

public class RootObject
{
    public List<Webinar> Webinars { get; set; }
}

用于反序列化对象:

var result = JsonConvert.DeserializeObject<RootObject>(json);

答案 1 :(得分:0)

您只创建了一个Webinar实例,但是您尝试反序列化Webinar列表。尝试:

FinalWebinarAttendeesList fl = JsonConvert.DeserializeObject<FinalWebinarAttendeesList>(json);