mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-23 20:49:33 +08:00
155 lines
5.6 KiB
C#
155 lines
5.6 KiB
C#
using System.Data;
|
|
using System.Text.Json;
|
|
using Milimoe.FunGame.Core.Library.Constant;
|
|
|
|
namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
|
|
{
|
|
internal class ConverterUtility
|
|
{
|
|
internal static void ReadColumns(Utf8JsonReader reader, DataTable dataTable)
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
if (reader.TokenType == JsonTokenType.EndArray)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (reader.TokenType == JsonTokenType.StartObject)
|
|
{
|
|
DataColumn column = new();
|
|
|
|
while (reader.Read())
|
|
{
|
|
if (reader.TokenType == JsonTokenType.PropertyName)
|
|
{
|
|
string propertyName = reader.GetString() ?? "";
|
|
|
|
switch (propertyName)
|
|
{
|
|
case "ColumnName":
|
|
reader.Read();
|
|
column.ColumnName = reader.GetString();
|
|
break;
|
|
|
|
case "DataType":
|
|
reader.Read();
|
|
Type dataType = Type.GetType(reader.GetString() ?? "") ?? typeof(object);
|
|
column.DataType = dataType;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (reader.TokenType == JsonTokenType.EndObject)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
dataTable.Columns.Add(column);
|
|
}
|
|
}
|
|
}
|
|
|
|
internal static void ReadRows(Utf8JsonReader reader, DataTable dataTable)
|
|
{
|
|
object[] values = new object[dataTable.Columns.Count];
|
|
|
|
while (reader.Read())
|
|
{
|
|
if (reader.TokenType == JsonTokenType.EndArray)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (reader.TokenType == JsonTokenType.StartArray)
|
|
{
|
|
int index = 0;
|
|
|
|
while (reader.Read())
|
|
{
|
|
if (reader.TokenType == JsonTokenType.EndArray)
|
|
{
|
|
break;
|
|
}
|
|
|
|
switch (dataTable.Columns[index].DataType.ToString())
|
|
{
|
|
case "System.Boolean":
|
|
values[index] = reader.GetBoolean();
|
|
break;
|
|
|
|
case "System.Byte":
|
|
values[index] = reader.GetByte();
|
|
break;
|
|
|
|
case "System.Char":
|
|
values[index] = (reader.GetString() ?? "")[0];
|
|
break;
|
|
|
|
case "System.DateTime":
|
|
string dateString = reader.GetString() ?? "";
|
|
if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime result))
|
|
{
|
|
values[index] = result;
|
|
}
|
|
else values[index] = General.DefaultTime;
|
|
break;
|
|
|
|
case "System.Decimal":
|
|
values[index] = reader.GetDecimal();
|
|
break;
|
|
|
|
case "System.Double":
|
|
values[index] = reader.GetDouble();
|
|
break;
|
|
|
|
case "System.Guid":
|
|
values[index] = Guid.Parse(reader.GetString() ?? Guid.Empty.ToString());
|
|
break;
|
|
|
|
case "System.Int16":
|
|
values[index] = reader.GetInt16();
|
|
break;
|
|
|
|
case "System.Int32":
|
|
values[index] = reader.GetInt32();
|
|
break;
|
|
|
|
case "System.Int64":
|
|
values[index] = reader.GetInt64();
|
|
break;
|
|
|
|
case "System.SByte":
|
|
values[index] = reader.GetSByte();
|
|
break;
|
|
|
|
case "System.Single":
|
|
values[index] = reader.GetSingle();
|
|
break;
|
|
|
|
case "System.String":
|
|
values[index] = reader.GetString() ?? "";
|
|
break;
|
|
|
|
case "System.UInt16":
|
|
values[index] = reader.GetUInt16();
|
|
break;
|
|
|
|
case "System.UInt32":
|
|
values[index] = reader.GetUInt32();
|
|
break;
|
|
|
|
case "System.UInt64":
|
|
values[index] = reader.GetUInt64();
|
|
break;
|
|
}
|
|
index++;
|
|
}
|
|
dataTable.Rows.Add(values);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|