将json文件反序列化为对象C#

将json文件反序列化为对象C#,c#,json,deserialization,C#,Json,Deserialization,我正在练习c#,我试图将这个嵌套JSON文件读入一个嵌套对象。我想我错过了什么。这是我到目前为止所拥有的 quick.json: quick.cs: Sport.cs: 数学课程: 问题2.cs: 使用系统; 使用System.Collections.Generic; 使用系统文本; 名称空间实践 { Q2类 { 公共字符串问题{get;set;} 公共IList选项{get;set;} 公共字符串答案{get;set;} } } 问题1.cs: 使用系统; 使用System.Collecti

我正在练习c#,我试图将这个嵌套JSON文件读入一个嵌套对象。我想我错过了什么。这是我到目前为止所拥有的

quick.json: quick.cs: Sport.cs: 数学课程: 问题2.cs:
使用系统;
使用System.Collections.Generic;
使用系统文本;
名称空间实践
{
Q2类
{
公共字符串问题{get;set;}
公共IList选项{get;set;}
公共字符串答案{get;set;}
}
}
问题1.cs:
使用系统;
使用System.Collections.Generic;
使用系统文本;
名称空间实践
{
Q1类
{
公共字符串问题{get;set;}
公共IList选项{get;set;}
公共字符串答案{get;set;}
}
}
Program.cs:
使用Newtonsoft.Json;
使用制度;
使用System.IO;
名称空间实践
{
班级计划
{
静态void Main(字符串[]参数)
{
QUITY QUITY=JsonConvert.DeserializeObject(文件.ReadAllText(@“C:\Users\Anthony Salvatore\source\repos\Practic\Practic\quick.json”);
//直接从文件反序列化JSON
使用(StreamReader file=file.OpenText(@“C:\Users\Anthony Salvatore\source\repos\Practic\Practic\quick.json”))
{
JsonSerializer serializer=新的JsonSerializer();
QUITY Quiz2=(QUITY)序列化程序。反序列化(文件,typeof(QUITY));
Console.WriteLine(Quiz2.Mathematics);
}
}
}
}

理想情况下,我希望运行program.cs,并希望填充测验对象,当我打印
Console.WriteLine(Quiz2.math)时我期待一个输出,但我得到的只是一个空行。有人能帮我弥补我所缺少的吗?我填充的对象是错误的吗?或者引用错误?

1-您不需要
Q2
类它与
Q1
类相同,只需使用
Q1

2-您应该为json根添加一个
RootObject
,其中包含
quick
属性,并在反序列化过程中使用此类,而不是
quick

class RootObject
{
    public Quiz Quiz { get; set; }
}
3-您不能使用
控制台。WriteLine
用于参考类型,如
数学
,但您可以显示
数学
运动
的每个属性

结果

RootObject root = JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(@"C:\Users\Anthony Salvatore\source\repos\Practic\Practic\Quiz.json"));
Quiz quiz = root?.Quiz;

// deserialize JSON directly from a file
using (StreamReader file = File.OpenText(@"C:\Users\Anthony Salvatore\source\repos\Practic\Practic\Quiz.json"))
{
    JsonSerializer serializer = new JsonSerializer();
    RootObject root2 = (RootObject)serializer.Deserialize(file, typeof(RootObject));

    Console.WriteLine($"Maths q1: {root2.Quiz.maths.q1.answer}, {root2.Quiz.maths.q1.question}," +
        $" {string.Join(",", root2.Quiz.maths.q1.options)}");

    Console.WriteLine($"Maths q2: {root2.Quiz.maths.q2.answer}, {root2.Quiz.maths.q2.question}," +
        $" {string.Join(",", root2.Quiz.maths.q2.options)}");

    Console.WriteLine($"sport: {root2.Quiz.sport.q1.answer}, {root2.Quiz.sport.q1.question}," +
        $" {string.Join(",", root2.Quiz.sport.q1.options)}");
}
RootObject root=JsonConvert.DeserializeObject(File.ReadAllText(@“C:\Users\Anthony Salvatore\source\repos\Practic\Practic\quick.json”);
测验=根?。测验;
//直接从文件反序列化JSON
使用(StreamReader file=file.OpenText(@“C:\Users\Anthony Salvatore\source\repos\Practic\Practic\quick.json”))
{
JsonSerializer serializer=新的JsonSerializer();
RootObject root2=(RootObject)序列化程序。反序列化(文件,typeof(RootObject));
Console.WriteLine($“数学q1:{root2.quick.math.q1.answer},{root2.quick.math.q1.question},”+
$“{string.Join(“,”,root2.quick.math.q1.options)}”;
Console.WriteLine($“数学q2:{root2.quick.math.q2.answer},{root2.quick.math.q2.question},”+
$“{string.Join(“,”,root2.quick.math.q2.options)}”;
Console.WriteLine($“sport:{root2.quick.sport.q1.answer},{root2.quick.sport.q1.question},”+
$“{string.Join(“,”,root2.quick.sport.q1.options)}”;
}
我希望这对您有所帮助。

请使用“问题编号”属性,如“问题编号:1”,而不是使用“q1”和“q2”,并指定问题编号。它将帮助您存储多个问题并轻松序列化数据


您还可以使用动态数据类型读取不可预测的JSON格式

这管用!这是干什么的?测验=根?。测验;访问属性
测验
。然后呢这就像root为null返回null一样。欲知详情
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Practic
    {
        class Sport
        {
            public Q1 q1 { get; set; }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Practic
    {
        class Maths
        {
            public Q1  q1 { get; set; }
            public Q2 q2 { get; set; }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Practic
    {
        class Q2
        {
            public string question { get; set; }
            public IList<string> options { get; set; }
            public string answer { get; set; }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Practic
    {
        class Q1
        {
            public string question { get; set; }
            public IList<string> options { get; set; }
            public string answer { get; set; }
        }
    }
    using Newtonsoft.Json;
    using System;
    using System.IO;
    
namespace Practic
{
    class Program
    {
        
        static void Main(string[] args)
        {
            Quiz Quiz = JsonConvert.DeserializeObject<Quiz>(File.ReadAllText(@"C:\Users\Anthony Salvatore\source\repos\Practic\Practic\Quiz.json"));

            // deserialize JSON directly from a file
            using (StreamReader file = File.OpenText(@"C:\Users\Anthony Salvatore\source\repos\Practic\Practic\Quiz.json"))
            {
                JsonSerializer serializer = new JsonSerializer();
                Quiz Quiz2 = (Quiz)serializer.Deserialize(file, typeof(Quiz));
                Console.WriteLine(Quiz2.maths);
            }
        }
    }
}

class RootObject
{
    public Quiz Quiz { get; set; }
}
RootObject root = JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(@"C:\Users\Anthony Salvatore\source\repos\Practic\Practic\Quiz.json"));
Quiz quiz = root?.Quiz;

// deserialize JSON directly from a file
using (StreamReader file = File.OpenText(@"C:\Users\Anthony Salvatore\source\repos\Practic\Practic\Quiz.json"))
{
    JsonSerializer serializer = new JsonSerializer();
    RootObject root2 = (RootObject)serializer.Deserialize(file, typeof(RootObject));

    Console.WriteLine($"Maths q1: {root2.Quiz.maths.q1.answer}, {root2.Quiz.maths.q1.question}," +
        $" {string.Join(",", root2.Quiz.maths.q1.options)}");

    Console.WriteLine($"Maths q2: {root2.Quiz.maths.q2.answer}, {root2.Quiz.maths.q2.question}," +
        $" {string.Join(",", root2.Quiz.maths.q2.options)}");

    Console.WriteLine($"sport: {root2.Quiz.sport.q1.answer}, {root2.Quiz.sport.q1.question}," +
        $" {string.Join(",", root2.Quiz.sport.q1.options)}");
}