[英]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.