在 C# 中使用 JSON 动态序列化和反序列化
Serializing and Deserializing dynamically using JSON in C#
首先,我想我正在尝试动态序列化和反序列化,而不是以编程方式。对不起,如果我在标题上有错误。
我是一名软件工程专业的学生,我正在尝试学习一些 JSON。我创建了一个 class(我可能会将其用作我的项目的 .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);
这是动物 Class:
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;
}
}
这是动物列表 Class:
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 object 我使用
反序列化它时得到的
JObject obj = jsonSerializer.Deserialize(jsonReader) as JObject;
是
{{
"ListOfAnimals": [
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
}
],
"NewAnimal": null,
"AnimalName": null,
"AnimalBreed": null
}}
但是,我觉得我不需要创建 AnimalList class 来执行此操作,但是如果我不这样做,当我尝试反序列化时,JSON 不会' 知道如何解释 JSON 文件中的信息。我不知道如何动态地告诉 JSON 这是一个动物列表。
这是用该方法创建的序列化文件的内容
{
"ListOfAnimals": [
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
},
{
"AnimalName": "Gatito",
"AnimalBreed": "Cat"
}
],
"NewAnimal": null,
"AnimalName": null,
"AnimalBreed": null
}
我尝试不使用 class AnimalList(只是一个 List<> of Animal),它创建了这个文件
[
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
}
]
因此,它将对其进行序列化,但不知道如何对其进行反序列化(此 JObject 将 return 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:如果有人认为我错了,或者有更好的方法,请告诉我。添加您的答案或发表评论。谢谢。
首先,我想我正在尝试动态序列化和反序列化,而不是以编程方式。对不起,如果我在标题上有错误。
我是一名软件工程专业的学生,我正在尝试学习一些 JSON。我创建了一个 class(我可能会将其用作我的项目的 .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);
这是动物 Class:
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;
}
}
这是动物列表 Class:
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 object 我使用
反序列化它时得到的JObject obj = jsonSerializer.Deserialize(jsonReader) as JObject;
是
{{
"ListOfAnimals": [
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
}
],
"NewAnimal": null,
"AnimalName": null,
"AnimalBreed": null
}}
但是,我觉得我不需要创建 AnimalList class 来执行此操作,但是如果我不这样做,当我尝试反序列化时,JSON 不会' 知道如何解释 JSON 文件中的信息。我不知道如何动态地告诉 JSON 这是一个动物列表。
这是用该方法创建的序列化文件的内容
{
"ListOfAnimals": [
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
},
{
"AnimalName": "Gatito",
"AnimalBreed": "Cat"
}
],
"NewAnimal": null,
"AnimalName": null,
"AnimalBreed": null
}
我尝试不使用 class AnimalList(只是一个 List<> of Animal),它创建了这个文件
[
{
"AnimalName": "Doggie",
"AnimalBreed": "Dog"
}
]
因此,它将对其进行序列化,但不知道如何对其进行反序列化(此 JObject 将 return 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:如果有人认为我错了,或者有更好的方法,请告诉我。添加您的答案或发表评论。谢谢。