[英]Deserializing json file into an object C#
我正在练习 c#,我试图将这个嵌套的 JSON 文件读入嵌套的 object。 我想我错过了一些东西。 这是我到目前为止所拥有的。
{
"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"
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Practic
{
class Quiz
{
public Sport sport { get; set; }
public Maths maths { get; set; }
}
}
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);
}
}
}
}
理想情况下,我想运行 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
等引用类型,但您可以显示Maths
或Sport
的每个属性。
结果:
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.