[英]Serializing and Deserializing dynamically using JSON in C#
首先,我想我正在尝试动态序列化和反序列化,而不是以编程方式。 对不起,如果我在标题中犯了错误。
我是一名软件工程专业的学生,我正在努力学习一些关于 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"
}
],
"NewAnimal": null,
"AnimalName": null,
"AnimalBreed": null
}
我试过没有类 AnimalList(只是一个 List<> 的 Animal),它创建了这个文件
[
{
"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:如果有人认为我错了,或者有更好的方法,请告诉我。 添加您的答案或发表评论。 谢谢你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.