Прежде всего, я думаю, что пытаюсь сериализовать и десериализовать динамически, а не программно. Извините, если ошибся в названии.
Я студент, изучающий программную инженерию, и я пытаюсь немного узнать о JSON. Я создал класс (вероятно, буду использовать его как .dll для своих проектов) для сериализации и десериализации.
public class JSONParser
{
public object JsonDeserialize(Type dataType, string filePath)
{
JsonSerializer jsonSerializer = new JsonSerializer();
StreamReader sr = new StreamReader(filePath);
JsonReader jsonReader = new JsonTextReader(sr);
JObject obj = jsonSerializer.Deserialize(jsonReader) as JObject;
jsonReader.Close();
sr.Close();
return obj.ToObject(dataType);
}
public void JsonSerialize(object data, string filePath)
{
JsonSerializer jsonSerializer = new JsonSerializer();
if (File.Exists(filePath))
{
File.Delete(filePath);
}
StreamWriter sw = new StreamWriter(filePath);
JsonWriter jsonWriter = new JsonTextWriter(sw);
jsonWriter.Formatting = Formatting.Indented;
jsonSerializer.Serialize(jsonWriter, data);
jsonWriter.Close();
sw.Close();
}
}
И я называю это так:
Animal animal = new Animal
{
AnimalName = AnimalNameTextBox,
AnimalBreed = AnimalBreedTextBox,
};
AnimalList Animal = new AnimalList ();
JSONParser jsonParser = new JSONParser();
if (File.Exists(_animalFilePath))
{
Animal = jsonParser.JsonDeserialize(typeof(AnimalList), _animalFilePath) as AnimalList;
}
Animal.ListOfAnimals.Add(animal);
jsonParser.JsonSerialize(Animal, _animalFilePath);
Вот класс животных:
public class Animal
{
public string AnimalName { get; set; }
public string AnimalBreed { get; set; }
public Animal()
{
}
public Animal(string AnimalName, string AnimalBreed)
{
this.AnimalName = AnimalName;
this.AnimalBreed = AnimalBreed;
}
}
Вот класс AnimalList:
public class AnimalList
{
public List<Animal> ListOfAnimals { get; set; }
public Animal NewAnimal { get; set; }
public string AnimalName { get; set; }
public string AnimalBreed { get; set; }
public AnimalList()
{
ListOfAnimals = new List<Animal>();
}
}
Это работает отлично до сих пор.
Объект JSON, который я получаю, когда десериализую его, используя
JObject obj = jsonSerializer.Deserialize(jsonReader) as JObject;
is
{{
"ListOfAnimals": [
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
}
],
"NewAnimal": null,
"AnimalName": null,
"AnimalBreed": null
}}
Но я чувствую, что мне не нужно создавать класс AnimalList, чтобы сделать это, но если я этого не сделаю, когда я попытаюсь десериализовать, JSON не знает, как интерпретировать информацию внутри файла JSON. Я не могу понять, как динамически сообщить JSON, что это список животных.
Это содержимое сериализованного файла, созданного с помощью этого метода.
{
"ListOfAnimals": [
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
},
{
"AnimalName": "Gatito",
"AnimalBreed": "Cat"
}
],
"NewAnimal": null,
"AnimalName": null,
"AnimalBreed": null
}
Я пробовал без класса AnimalList (просто список‹› животных), и он создает этот файл
[
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
}
]
Итак, он сериализует его, но не знает, как его десериализовать (этот JObject вернет null).
JObject obj = jsonSerializer.Deserialize(jsonReader) as JObject;
Что я делаю не так? Извините, если это слишком длинно; Я старался быть максимально ясным.
Спасибо
null
, потому что вы сериализуетеdata
(экземплярAnimalList
), и он десериализует тот же тип, который вы пытаетесь преобразовать вJObject
(невозможно, поэтомуnull
). Рассмотрите возможность использования универсальногоDeserialize<T>
, который просто вызовет универсальный метод Json.net. Тогда вы можете просто позвонитьDeserialize<AnimalList>()
. - person Sinatr   schedule 28.09.2020Deserialize
работал для чего угодно, вам нужно передать в него параметр типа. Если вы знаете тип во время компиляции, то дженерики — самый удобный способ. - person Sinatr   schedule 28.09.2020List<Animal>
, вам придется десериализовать его, используяDeserilize<List<Animal>>()
. См. это (полагаю, вы используете json.net). - person Sinatr   schedule 28.09.2020public object JsonDeserialize<T>(Type dataType, string filePath)
звонил из:List<Animal> Animal = jsonParser.JsonDeserialize<List<Animal>>(typeof(List<Animal>), _animalFilePath) as List<Animal>
; Объект по-прежнему возвращается null. Я думаю, что слишком усложняю вещи. Я? - person CarlosMira   schedule 28.09.2020public object JsonDeserialize<T>(string filePath) { String JSONtxt = File.ReadAllText(filePath); var obj = JsonConvert.DeserializeObject<T>(JSONtxt); return obj; }
- person CarlosMira   schedule 28.09.2020