如何在C#中解析JsonObject

时间:2014-02-12 16:43:47

标签: c# .net json json.net

我正在尝试解析下面的json对象,但我不知道如何做到这一点因为json对象中的“讲师”?我不知道如何管理“讲师”他们是Json中的另一个对象但是在数据[0]中它是一个对象和数据[1]它是一个标志或布尔值。这件事让我很困惑。任何想法我怎么能实现这个???

{
    "result": "Success",
    "data": [
        {
            "student_course_id": "82",
            "student_id": "30",
            "term_course_id": "18",
            "section_id": "3",
            "term_id": "12",
            "course_id": "15",
            "credit_hours": "26",
            "is_elective": "Elective",
            "is_practical": "0",
            "teacher_id": "10",
            "program_id": "5",
            "course_code": "E2",
            "course_title": "English 2",
            "lecturer": {
                "fname": "Ali",
                "lname": "farooq",
                "phone": "1234567890",
                "email": "farooq@teacher.com",
                "thumb": "../photos/thumb/1391515491.png"
            }
        },
        {
            "student_course_id": "83",
            "student_id": "30",
            "term_course_id": "19",
            "section_id": "3",
            "term_id": "12",
            "course_id": "16",
            "credit_hours": "26",
            "is_elective": "Elective",
            "is_practical": "0",
            "teacher_id": "8",
            "program_id": "5",
            "course_code": "C2",
            "course_title": "Culture 2",
            "lecturer": false
        }
        ]
}

C#代码

public async static Task<StudentSubjectsClassWithError> StudentSubjectsList()
{
    HttpClient client = new HttpClient();

    string baseUrl = getBaseUrl();

    try
    {
        string flickrResult = await client.GetStringAsync(baseUrl);
        StudentSubjectsClassWithError studentSubjectsResult = new StudentSubjectsClassWithError();
        try
        {

            StudentSubjectsJson apiData =
                JsonConvert.DeserializeObject<StudentSubjectsJson>(flickrResult);

            List<StudentSubjectsClass> mStudentSubjectsList = new List<StudentSubjectsClass>();

            if (apiData.data != null && apiData.result == "Success")
            {
                studentSubjectsResult.message = "";
                studentSubjectsResult.result = apiData.result;

                foreach (StudentSubjectsJsonItem data in apiData.data)
                {
                    StudentSubjectsClass studentSubjects = new StudentSubjectsClass();

                    studentSubjects.student_course_id = data.student_course_id;
                    studentSubjects.student_id = data.student_id;
                    studentSubjects.term_course_id = data.term_course_id;
                    studentSubjects.section_id = data.section_id;
                    studentSubjects.term_id = data.term_id;
                    studentSubjects.course_id = data.course_id;
                    studentSubjects.credit_hours = data.credit_hours;
                    studentSubjects.is_elective = data.is_elective;
                    studentSubjects.is_practical = data.is_practical;
                    studentSubjects.program_id = data.program_id;
                    studentSubjects.course_code = data.course_code;
                    studentSubjects.course_title = data.course_title;

                   //// studentSubjects.lecturer ?????

                    mStudentSubjectsList.Add(studentSubjects);
                }
            }
            else
            {
                studentSubjectsResult.result = apiData.result;
                studentSubjectsResult.message = "No records found.";

            }
            studentSubjectsResult.studentSubjectsList = mStudentSubjectsList;
            return studentSubjectsResult;
        }
        catch (JsonSerializationException)
        {

            try
            {

                StudentSubjectsErrorJson apiData =
                   JsonConvert.DeserializeObject<StudentSubjectsErrorJson>(flickrResult);
                studentSubjectsResult.result = apiData.result;
                studentSubjectsResult.message = apiData.data;
                studentSubjectsResult.studentSubjectsList = null;
                return studentSubjectsResult;
            }

            catch (JsonSerializationException)
            {
            }


        }
        return null;
    }
    catch (Exception)
    {
        return null;
     //   MessageBox.Show("Internet Connection Problem");
    }
}

4 个答案:

答案 0 :(得分:5)

我正在使用Visual Studio 2012,当我想将Json字符串转换为C#类对象时,我复制了Json字符串并且

-> Click Edit
-> Click Paste Special
-> Click Paste JSON as Classes

或者您可以使用Jonathan Keith http://json2csharp.com/

提供的精彩在线工具

使用json2csharp我从你的json

获得了这个类
public class Datum
{
    public string student_course_id { get; set; }
    public string student_id { get; set; }
    public string term_course_id { get; set; }
    public string section_id { get; set; }
    public string term_id { get; set; }
    public string course_id { get; set; }
    public string credit_hours { get; set; }
    public string is_elective { get; set; }
    public string is_practical { get; set; }
    public string teacher_id { get; set; }
    public string program_id { get; set; }
    public string course_code { get; set; }
    public string course_title { get; set; }
    public object lecturer { get; set; }
}

public class RootObject
{
    public string result { get; set; }
    public List<Datum> data { get; set; }
}

修改

我还注意到你的数据数组有讲师作为对象,第二个数据有讲师作为bool。如果它不存在,你可以通过简单地不包括讲师来解决这个问题。这会将类更改为:

public class Lecturer
{
    public string fname { get; set; }
    public string lname { get; set; }
    public string phone { get; set; }
    public string email { get; set; }
    public string thumb { get; set; }
}

public class Datum
{
    public string student_course_id { get; set; }
    public string student_id { get; set; }
    public string term_course_id { get; set; }
    public string section_id { get; set; }
    public string term_id { get; set; }
    public string course_id { get; set; }
    public string credit_hours { get; set; }
    public string is_elective { get; set; }
    public string is_practical { get; set; }
    public string teacher_id { get; set; }
    public string program_id { get; set; }
    public string course_code { get; set; }
    public string course_title { get; set; }
    public Lecturer lecturer { get; set; }
}

public class RootObject
{
    public string result { get; set; }
    public List<Datum> data { get; set; }
}

答案 1 :(得分:0)

您获得了最高级别StudentSubjectsJsonStudentSubjectsJsonItem数组中每个等级获得data

对于讲师,您需要定义StudentSubjectsJsonLecturer并设置为StudentSubjectsJsonItem lecturer的属性。

例如:

public class StudentSubjectsJsonItem {
    //Existing properties
    public StudentSubjectsJsonLecturer lecturer {get;set;}
}

public class StudentSubjectsJsonLecturer {
    public string fname {get;set;}
    public string lname {get;set;}
    //And so on...
}

答案 2 :(得分:0)

由于您已经在复制属性(您不应该这样做,这就是反序列化的用途),您可以将数据反序列化为dynamic对象(Newtonsoft Json v4 +):

dynamic apiData = JsonConvert.DeserializeObject<StudentSubjectsJson>(flickrResult);

然后继续执行其余代码,然后当你必须处理`讲师'时,检查它是否像往常一样“假”:

if (apiData.data[x].lecturer != false){
...
}

免责声明:我没有对此进行编译尝试,这是一个建议尝试的内容

答案 3 :(得分:0)

我建议您使用第三方json库而不是自己编写一个。特别是这一个:click to download

它是一个单文件的json库。