diff --git a/Main.cs b/Main.cs index ee18d95..99efd75 100644 --- a/Main.cs +++ b/Main.cs @@ -1,7 +1,6 @@ using System.Collections; using System.Data; -using System.Text.Json; -using System.Text.Json.Serialization; +using ConverterExample; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Common.JsonConverter; @@ -25,15 +24,15 @@ table.Rows.Add(2, "Jane", 25); table.Rows.Add(3, "Bob", 40); ds.Tables.Add(table); -JsonSerializerOptions options = new() +System.Text.Json.JsonSerializerOptions options = new() { WriteIndented = true, - ReferenceHandler = ReferenceHandler.IgnoreCycles, - Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter() } + ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles, + Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(), new PersonConverter(), new AddressConverter() } }; Room r = Factory.GetRoom(1294367, "w5rtvh8".ToUpper(), DateTime.Now, Factory.GetUser(), Milimoe.FunGame.Core.Library.Constant.RoomType.Mix, Milimoe.FunGame.Core.Library.Constant.RoomState.Created); -User u = Factory.GetUser(1, "LUOLI", "123123", DateTime.Now, DateTime.Now, "LUOLI@66.COM", "QWQAQW"); +User u = Factory.GetUser(1, "LUOLI", DateTime.Now, DateTime.Now, "LUOLI@66.COM", "QWQAQW"); Hashtable hashtable = new() { @@ -42,11 +41,28 @@ Hashtable hashtable = new() { "user", u } }; -string json = JsonSerializer.Serialize(hashtable, options); +string json = NetworkUtility.JsonSerialize(hashtable, options); -Hashtable hashtable2 = JsonSerializer.Deserialize(json, options) ?? new(); +Hashtable hashtable2 = NetworkUtility.JsonDeserialize(json, options) ?? new(); User u2 = NetworkUtility.JsonDeserializeFromHashtable(hashtable2, "user") ?? Factory.GetUser(); Room r2 = NetworkUtility.JsonDeserializeFromHashtable(hashtable2, "room") ?? Factory.GetRoom(); -System.Console.WriteLine(u2.Username + " 进入了 " + r2.Roomid + " 房间"); \ No newline at end of file +Console.WriteLine(u2.Username + " 进入了 " + r2.Roomid + " 房间"); + +Person p = new() +{ + Age = (int)r2.Id, + Name = u2.Username, + Address = new() + { + State = "呵呵州(Hehe State)", + City = "哈哈市(Haha City)" + } +}; + +json = NetworkUtility.JsonSerialize(p, options); + +Person p2 = NetworkUtility.JsonDeserialize(json, options) ?? new(); + +Console.WriteLine("My name is " + p2.Name + ", I am " + p2.Age + "-year-old. I live at " + p2.Address.State + " " + p2.Address.City); \ No newline at end of file diff --git a/Solutions/Person.cs b/Solutions/Person.cs index 857866c..889ddae 100644 --- a/Solutions/Person.cs +++ b/Solutions/Person.cs @@ -1,77 +1,69 @@ -using System; using System.Text.Json; -using System.Text.Json.Serialization; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Library.Common.Architecture; -namespace ConsoleApp1 +namespace ConverterExample { - class Program - { - static void Main(string[] args) - { - string jsonString = @"{""name"": ""John"", ""age"": 30, ""address"": {""city"": ""New York"", ""state"": ""NY""}}"; - - var options = new JsonSerializerOptions(); - options.Converters.Add(new PersonConverter()); - - var person = JsonSerializer.Deserialize(jsonString, options); - - Console.WriteLine(person.Name); - Console.WriteLine(person.Age); - Console.WriteLine(person.Address.City); - Console.WriteLine(person.Address.State); - } - } - public class Person { - public string Name { get; set; } + public string Name { get; set; } = ""; public int Age { get; set; } - public Address Address { get; set; } + public Address Address { get; set; } = new(); } public class Address { - public string City { get; set; } - public string State { get; set; } + public string State { get; set; } = ""; + public string City { get; set; } = ""; } - public class PersonConverter : JsonConverter + public class AddressConverter : BaseEntityConverter
{ - public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Address? result) { - string name = null; - int age = 0; - Address address = null; - - while (reader.Read()) + result ??= new(); + switch (propertyName) { - if (reader.TokenType == JsonTokenType.EndObject) - { + case "city": + result.City = reader.GetString() ?? ""; break; - } - if (reader.TokenType == JsonTokenType.PropertyName) - { - string propertyName = reader.GetString(); - - switch (propertyName) - { - case "name": - name = reader.GetString(); - break; - - case "age": - age = reader.GetInt32(); - break; - - case "address": - address = JsonSerializer.Deserialize
(ref reader, options); - break; - } - } + case "state": + result.State = reader.GetString() ?? ""; + break; } + } - return new Person { Name = name, Age = age, Address = address }; + public override void Write(Utf8JsonWriter writer, Address value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + + writer.WriteString("state", value.State); + writer.WriteString("city", value.City); + + writer.WriteEndObject(); + } + } + + public class PersonConverter : BaseEntityConverter + { + public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Person? result) + { + result ??= new(); + switch (propertyName) + { + case "name": + result.Name = reader.GetString() ?? ""; + break; + + case "age": + result.Age = reader.GetInt32(); + break; + + case "address": + result.Address = NetworkUtility.JsonDeserialize
(reader.GetString() ?? "", options) ?? new Address(); + break; + } } public override void Write(Utf8JsonWriter writer, Person value, JsonSerializerOptions options) @@ -80,9 +72,7 @@ namespace ConsoleApp1 writer.WriteString("name", value.Name); writer.WriteNumber("age", value.Age); - - writer.WritePropertyName("address"); - JsonSerializer.Serialize(writer, value.Address, options); + writer.WriteString("address", NetworkUtility.JsonSerialize(value.Address, options)); writer.WriteEndObject(); }