繁体   English   中英

将 json 文件反序列化为 object C#

[英]Deserializing json file into an object C#

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

测验.json:

    {
        "quiz": {
            "sport": {
                "q1": {
                    "question": "Which one is correct team name in NBA?",
                    "options": [
                        "New York Bulls",
                        "Los Angeles Kings",
                        "Golden State Warriros",
                        "Huston Rocket"
                    ],
                    "answer": "Huston Rocket"
                }
            },
            "maths": {
                "q1": {
                    "question": "5 + 7 = ?",
                    "options": [
                        "10",
                        "11",
                        "12",
                        "13"
                    ],
                    "answer": "12"
                },
                "q2": {
                    "question": "12 - 8 = ?",
                    "options": [
                        "1",
                        "2",
                        "3",
                        "4"
                    ],
                    "answer": "4"
                }
            }
        }
    }

测验.cs:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Practic
    {
        class Quiz
        {
            public Sport sport { get; set; }
            public Maths maths { get; set; }
        }
    }

运动.cs:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Practic
    {
        class Sport
        {
            public Q1 q1 { get; set; }
        }
    }

数学.cs:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Practic
    {
        class Maths
        {
            public Q1  q1 { get; set; }
            public Q2 q2 { get; set; }
        }
    }

Q2.cs:

    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; }
        }
    }

Q1.cs:

    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; }
        }
    }

程序.cs:

    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);
            }
        }
    }
}

理想情况下,我想运行 program.cs,并且我希望填充测验 object,并且当我打印Console.WriteLine(Quiz2.maths); 我期待一个 output,但我得到的只是一个空行。 有人可以帮我解决我所缺少的吗? 我填错了 object 吗? 或引用错误?

1 - 您不需要Q2 class 它与Q1 class 相同,仅使用Q1
2 - 您应该为 json 根添加一个包含Quiz属性的RootObject ,并在反序列化期间使用此 class 而不是Quiz class。

class RootObject
{
    public Quiz Quiz { get; set; }
}

3 - 您不能将Console.WriteLine用于Maths等引用类型,但您可以显示MathsSport的每个属性。

结果

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)}");
}

我希望你觉得这有帮助。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM