Как получить доступ и сохранить определенный объект из файла json в c# - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь сделать многопредметную викторину для детей с помощью unity3D, а вопросы и ответы хранятся в файле json. Теперь я хочу создать объект с именем «наука» и «математика» и хочу сохранить в них соответствующие вопросы, и когда я хочу получить доступ к науке, я могу l oop и найти и просто сохранить научный вопрос в моей строке вместо чтение всего json файла.

вот мой json файл.

    Science ={
    "CourseName":"Science",
    "No_Of_Ques":4,
    "Ques_Data":[
                  { "Quesion":"which is the biggest planet in the solar system?",
                    "Answer":"jupiter",
                    "options":["mars","earth","venus","jupiter"] 
                  },

                  { "Quesion":"How many planets are there in solar system?",
                    "Answer":"Eight",
                    "options":["Seven","Nine","Five","Eight"] 
                  },

                  { "Quesion":"which is the closest planet to the sun?",
                    "Answer":"mercury",
                    "options":["mars","saturn","venus","mercury"] 
                  },

                  { "Quesion":"How many moons does jupiter have?",
                    "Answer":"12",
                    "options":["5","13","9","12"] 
                  }
                ]   
}

и так я до сих пор обращался к нему

path = Application.dataPath + "/QnA.json";
    string json = File.ReadAllText(path);
    Course c1 = JsonUtility.FromJson<Course>(json);

    return c1;

Курс и необходимые сериализуемые классы:

[Serializable] public class Course 
{ 
    public string CourseName;
    public string No_Of_Ques;
    public QnA[] Ques_Data; 
}

[Serializable]
public class QnA 
{ 
    public string Quesion;
    public string Answer;
    public string[] options;
} 

Я пробовал так много вещей, как десериализация и актив Jobject, но ни один из них, похоже, не работает, и каждая реализация, которую я нашел на inte rnet, имеет json данные в том же файле, что и код c#, но я не могу этого сделать, поскольку мой json содержит сотни строк данных. пожалуйста, помогите мне немного.

Ответы [ 4 ]

2 голосов
/ 28 мая 2020

Создайте класс курса, в котором создайте функции получения и установки для всех ваших json ключей, например:

, если ваш json файл такой:

[
  {
    "CourseName": "Science",
    "No_Of_Ques": 1,
    ...
  },
  {
    "CourseName": "Math",
    "No_Of_Ques": 1,
    ...
  }
]

тогда класс курса должен быть:

public class Course
    {
        public string CourseName { get; set; }
        public int No_Of_Ques { get; set; }
    }

В вашем основном классе или в любом другом месте, где вы можете получить доступ к выбранному курсу, здесь я использую только индекс 0 из json, вы также можете l oop через целиком json и найдите желаемый курс.

  • StreamReader для чтения файла
  • преобразовать его в json
  • Десериализовать json в соответствии с вашим конечно
  • Консоль

        using (StreamReader r = new StreamReader("../../../js.json"))
        {
            string json = r.ReadToEnd();
            List<Course> ro = JsonSerializer.Deserialize<List<Course>>(json);
            Console.WriteLine(ro[0].CourseName);
        }
    

Я добавил json файл в тот же самый ужас, где находится мой файл mainClass, поскольку StreamReader требует абсолютного пути, поэтому Я использовал абсолютный путь для моего файла json.

using (StreamReader r = new StreamReader("../../../js.json"))

Требовать библиотеки

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;

Примечание. Я создал консольное приложение, а не убедитесь, что ваше приложение тип

0 голосов
/ 28 мая 2020

Если вы хотите сохранить несколько курсов в своем файле, вам нужно будет сохранить их как массив json (вы делаете это с вопросами):

[
   {
      "CourseName":"Science",
      "No_Of_Ques":1,
      "Ques_Data":[
         {
            "Question":"which is the biggest planet in the solar system?",
            "Answer":"jupiter",
            "options":[
               "mars",
               "jupiter"
            ]
         }
      ]
   },
   {
      "CourseName":"Math",
      "No_Of_Ques":1,
      "Ques_Data":[
         {
            "Question":"2 + 2",
            "Answer":"4",
            "options":[
               "4",
               "0"
            ]
         }
      ]
   }
]

, тогда вы можете десериализовать их с помощью следующей структуры ( например):

public class Course
{
    [JsonProperty("CourseName")]
    public string CourseName { get; set; }
    [JsonProperty("No_Of_Ques")]
    public long NoOfQues { get; set; }
    [JsonProperty("Ques_Data")]
    public QuesDatum[] QuesData { get; set; }
}

public class QuesDatum
{
    [JsonProperty("Question")]
    public string Question{ get; set; }

    [JsonProperty("Answer")]
    public string Answer { get; set; }

    [JsonProperty("options")]
    public string[] Options { get; set; }
}


var courses = JsonConvert.DeserializeObject<List<Course>>(jsonString);
var course = courses.Where(...).FirstOrDefault();

Или попробуйте использовать json путь :

var course = JToken.Parse(jsonString)
    .SelectToken("$[?(@.CourseName == 'Math')]")
    .ToObject<Course>();

Что касается jsonString, вы можете получить его любым способом, чтение из файла, например.

PS

Была опечатка «Вопрос» -> «Вопрос»

0 голосов
/ 28 мая 2020

Использование Science={...} для определения вашего объекта - вот где вы запутаетесь в определениях объектов. Это не объект Science. Это объект Course.

Он должен быть больше похож на

{
    "Courses" :
    [
        {
            "CourseName" : "Science",
            ...
        },
        {
            "CourseName" : "Maths",
            ...
        }
    ]
}`.

Оберните его:

"Quiz" :
{
    "Courses" :
    [
        {
            "CourseName" : "Science",
            ...
        },
        {
            "CourseName" : "Maths",
            ...
        }
    ]
}

и используйте

[Serializable]
public class Quiz
{
    public Course[] courses;
}

Чтобы сохранить его как объект C#.

Отсюда вы можете получить доступ к своим курсам с помощью quiz.Courses[0].Questions[17] или написать вспомогательные методы в классе Quiz для вызова курсов с помощью перечислений, например quiz.GetCourse(CourseCategory.Science).Questions[8].

Я также предлагаю использовать Questions вместо Question_Data. Это более дружественно к объектам и помогает вам семантически.

В качестве дополнительного предложения, вместо того, чтобы сбрасывать всю викторину в один JSON, вы можете рассмотреть возможность отправки одного объекта Course в зависимости от курса, запрашивается с помощью запроса типа http://myquizserver.com/quiz.php?course=science. Поскольку вы упомянули сотни строк JSON, вы также можете рассмотреть возможность получения данных вопрос за вопросом.

0 голосов
/ 28 мая 2020

Для сериализации и десериализации объектов вам необходимо создать класс C# (в вашем случае должен быть класс Course), который может быть [Serializable].

Сначала ваш Json должен быть допустимым, что это такое, вы можете проверить его здесь .

Для сериализации и десериализации вы можете использовать JsonUtility до определенного момента, потому что он не десериализует зубчатые массивы, сложные объекты и т. д. c. Я рекомендую использовать стороннее программное обеспечение, например Newtonsoft , или реализовать свой собственный метод сериализации / десериализации для вашего способа .

Изменить:

Ваш JSON файл должен быть без части "Science =", он должен выглядеть так:

{
    "CourseName":"Science",
    "No_Of_Ques":4,
    "Ques_Data":[
                  { "Quesion":"which is the biggest planet in the solar system?",
                    "Answer":"jupiter",
                    "options":["mars","earth","venus","jupiter"] 
                  },

                  { "Quesion":"How many planets are there in solar system?",
                    "Answer":"Eight",
                    "options":["Seven","Nine","Five","Eight"] 
                  },

                  { "Quesion":"which is the closest planet to the sun?",
                    "Answer":"mercury",
                    "options":["mars","saturn","venus","mercury"] 
                  },

                  { "Quesion":"How many moons does jupiter have?",
                    "Answer":"12",
                    "options":["5","13","9","12"] 
                  }
                ]   
}

Изменить: для вашего комментария, я думаю, вы неправильно поняли, как обрабатывать отношения между файлами и переменные.

Конечно, вы хотите иметь (или, по крайней мере, так кажется) по одному файлу для каждого типа, поэтому в этом случае приведенный выше текст будет вашим файлом Science. json.

Когда вы сохраняете эту информацию, вы будете делать то же самое, что и вы:

path = Application.dataPath + "/QnA.json";
    string json = File.ReadAllText(path);
    Course scienceCourse = JsonUtility.FromJson<Course>(json); //notice the name of the variable!

Итак, как вы можете видеть для имени переменной, вы будете читать КАЖДЫЙ JSON для каждого курса.

Другой способ сделать это - сохранить все курсы в одном файле Json, а затем получить их как МАССИВ курсов -> Course[] allCourses

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...