问题描述
首先,我想我正在尝试动态地而不是以编程方式进行序列化和反序列化。抱歉,如果我在标题上输入错误。
我是一名软件工程专业的学生,我想学习一些有关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;
是
{{
"ListOfAnimals": [
{
"AnimalName": "Doggie","AnimalBreed": "Dog"
}
],"NewAnimal": null,"AnimalName": null,"AnimalBreed": null
}}
但是,我觉得我不需要创建AnimalList类来执行此操作,但是,如果我不这样做,那么当我尝试反序列化时,JSON不知道如何解释其中的信息。 JSON文件。我无法弄清楚如何动态地告诉JSON这是动物列表。
这是用此方法创建的序列化文件的内容
{
"ListOfAnimals": [
{
"AnimalName": "Doggie","AnimalBreed": "Dog"
},{
"AnimalName": "Gatito","AnimalBreed": "Cat"
}
],"AnimalBreed": null
}
我尝试了不使用AnimalList类(只是Animal的List ),它创建了这个文件
[
{
"AnimalName": "Doggie","AnimalBreed": "Dog"
}
]
因此,它将序列化它,但是它不知道如何反序列化(此JObject将返回null)。
JObject obj = jsonSerializer.Deserialize(jsonReader) as JObject;
我在做什么错? 对不起,如果太长;我试图尽可能清楚。
谢谢
解决方法
感谢@Sinatr的帮助。 这是我设法做到的,而无需使用充当List 的类。
public object JsonDeserialize<T>(string filePath)
{
String JSONtxt = File.ReadAllText(filePath);
var obj = JsonConvert.DeserializeObject<T>(JSONtxt);
return obj;
}
public object JsonDeserialize<T>(string filePath)
{
String JSONtxt = File.ReadAllText(filePath);
var obj = JsonConvert.DeserializeObject<T>(JSONtxt);
return obj;
}
然后,这样称呼它:
要保存到文件
Client client = new Client
{
ClientName = NameTextBox,ClientAge = Convert.ToInt32(AgeTextBox),ClientStreet = StreetTextBox,};
List<Client> ClientList = new List<Client>();
JSONParser jsonParser = new JSONParser();
//Check if File exists. If it does,deserialize the file and add the content to the List Client
if (File.Exists(_filePath))
{
ClientList = jsonParser.JsonDeserialize<List<Client>>(_filePath) as List<Client>;
}
ClientList.Add(client);
jsonParser.JsonSerialize<List<Client>>(ClientList,_filePath);
要从文件加载:
// First,check if file already exists
if (!File.Exists(_filePath))
{
MessageBox.Show("The file is empty. Please,save some details before trying to load it.");
return;
}
// If file doesn't exist
else
{
JSONParser jsonParser = new JSONParser();
List<Client> ClientList = jsonParser.JsonDeserialize<List<Client>>(_filePath) as List<Client>;
}
我希望这可以帮助其他人。 再次感谢@Sinatr。
PS:如果有人认为我错了,或者有更好的解决方法,请告诉我。添加您的答案或发表评论。谢谢。