NewLife/X

EnumString 枚举使用字符串。默认false使用数字
大石头 编写于 2020-01-08 20:04:22
共计: 修改7个文件,增加102行、删除16行。
修改 +4 -1
修改 +23 -5
增加 +63 -0
修改 +1 -1
修改 +5 -5
修改 +0 -1
修改 +6 -3
修改 +4 -1
diff --git a/NewLife.Core/Serialization/Json/JsonParser.cs b/NewLife.Core/Serialization/Json/JsonParser.cs
index c0f0391..a67ab98 100644
--- a/NewLife.Core/Serialization/Json/JsonParser.cs
+++ b/NewLife.Core/Serialization/Json/JsonParser.cs
@@ -399,7 +399,10 @@ namespace NewLife.Serialization
                 return Double.Parse(s, NumberFormatInfo.InvariantInfo);
             }
 
-            return CreateLong(out var num, _json, startIndex, index - startIndex);
+            var m = CreateLong(out _, _json, startIndex, index - startIndex);
+            if (m < Int32.MaxValue && m > Int32.MinValue) return (Int32)m;
+
+            return m;
         }
 
         private Token LookAhead()
修改 +23 -5
diff --git a/NewLife.Core/Serialization/Json/JsonWriter.cs b/NewLife.Core/Serialization/Json/JsonWriter.cs
index e7c73f3..49612f3 100644
--- a/NewLife.Core/Serialization/Json/JsonWriter.cs
+++ b/NewLife.Core/Serialization/Json/JsonWriter.cs
@@ -24,6 +24,9 @@ namespace NewLife.Serialization
         /// <summary>写入空值。默认true</summary>
         public Boolean NullValue { get; set; } = true;
 
+        /// <summary>枚举使用字符串。默认false使用数字</summary>
+        public Boolean EnumString { get; set; }
+
         /// <summary>最大序列化深度。默认5</summary>
         public Int32 MaxDepth { get; set; } = 5;
 
@@ -32,10 +35,7 @@ namespace NewLife.Serialization
 
         #region 构造
         /// <summary>实例化</summary>
-        public JsonWriter()
-        {
-            UseUTCDateTime = false;
-        }
+        public JsonWriter() { }
         #endregion
 
         #region 静态转换
@@ -63,6 +63,14 @@ namespace NewLife.Serialization
         #endregion
 
         #region 写入方法
+        /// <summary>写入对象</summary>
+        /// <param name="value"></param>
+        public void Write(Object value) => WriteValue(value);
+
+        /// <summary>获取结果</summary>
+        /// <returns></returns>
+        public String GetString() => _Builder.ToString();
+
         private void WriteValue(Object obj)
         {
             if (obj == null || obj is DBNull)
@@ -115,7 +123,12 @@ namespace NewLife.Serialization
                 WriteArray((IEnumerable)obj);
 
             else if (obj is Enum)
-                WriteValue(Convert.ToInt32(obj));
+            {
+                if (EnumString)
+                    WriteValue(obj + "");
+                else
+                    WriteValue(Convert.ToInt32(obj));
+            }
 
             else
                 WriteObject(obj);
@@ -171,7 +184,12 @@ namespace NewLife.Serialization
             if (dt.Year > 1000)
             {
                 if (dt.Hour == 0 && dt.Minute == 0 && dt.Second == 0)
+                {
                     str = dt.ToString("yyyy-MM-dd");
+
+                    // 处理UTC
+                    if (dt.Kind == DateTimeKind.Utc) str += " UTC";
+                }
                 else
                     str = dt.ToFullString();
             }
增加 +63 -0
diff --git a/XUnitTest.Core/Json/JsonWriterTests.cs b/XUnitTest.Core/Json/JsonWriterTests.cs
new file mode 100644
index 0000000..94c5272
--- /dev/null
+++ b/XUnitTest.Core/Json/JsonWriterTests.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NewLife.Log;
+using NewLife.Serialization;
+using Xunit;
+
+namespace XUnitTest.Json
+{
+    public class JsonWriterTests
+    {
+        [Fact]
+        public void UtcTest()
+        {
+            var writer = new JsonWriter();
+
+            var dt = DateTime.UtcNow;
+            writer.Write(new { time = dt });
+
+            var str = writer.GetString();
+            Assert.NotEmpty(str);
+
+            var js = new JsonParser(str);
+            var dic = js.Decode() as IDictionary<String, Object>;
+            Assert.NotNull(dic);
+
+            var str2 = dic["time"];
+            Assert.Equal(dt.ToFullString(), str2);
+
+            var dt2 = dic["time"].ToDateTime();
+            Assert.Equal(dt.Trim(), dt2.Trim());
+        }
+
+        [Fact]
+        public void EnumTest()
+        {
+            // 字符串
+            var writer = new JsonWriter { EnumString = true };
+
+            var data = new { Level = LogLevel.Fatal };
+            writer.Write(data);
+
+            var js = new JsonParser(writer.GetString());
+            var dic = js.Decode() as IDictionary<String, Object>;
+            Assert.NotNull(dic);
+
+            var str2 = dic["Level"];
+            Assert.Equal("Fatal", str2);
+
+            // 数字
+            var writer2 = new JsonWriter { EnumString = false };
+
+            writer2.Write(data);
+
+            var js2 = new JsonParser(writer2.GetString());
+            var dic2 = js2.Decode() as IDictionary<String, Object>;
+            Assert.NotNull(dic2);
+
+            Assert.Equal(5, dic2["Level"]);
+            Assert.Equal((Int32)LogLevel.Fatal, dic2["Level"].ToInt());
+        }
+    }
+}
\ No newline at end of file
修改 +1 -1
diff --git a/XUnitTest.Core/PropertyInfo.cs b/XUnitTest.Core/PropertyInfo.cs
index 748bca7..53a4c48 100644
--- a/XUnitTest.Core/PropertyInfo.cs
+++ b/XUnitTest.Core/PropertyInfo.cs
@@ -3,4 +3,4 @@ using System.Collections.Generic;
 using System.Text;
 using Xunit;
 
-[assembly: TestCaseOrderer("Xunit.Extensions.Ordering.TestCaseOrderer", "Xunit.Extensions.Ordering")]
\ No newline at end of file
+//[assembly: TestCaseOrderer("Xunit.Extensions.Ordering.TestCaseOrderer", "Xunit.Extensions.Ordering")]
\ No newline at end of file
修改 +5 -5
diff --git a/XUnitTest.Core/Remoting/ApiTest.cs b/XUnitTest.Core/Remoting/ApiTest.cs
index 69106a9..07437d0 100644
--- a/XUnitTest.Core/Remoting/ApiTest.cs
+++ b/XUnitTest.Core/Remoting/ApiTest.cs
@@ -7,7 +7,7 @@ using NewLife.Net;
 using NewLife.Remoting;
 using NewLife.Security;
 using Xunit;
-using Xunit.Extensions.Ordering;
+//using Xunit.Extensions.Ordering;
 
 namespace XUnitTest.Remoting
 {
@@ -41,7 +41,7 @@ namespace XUnitTest.Remoting
             _Server.TryDispose();
         }
 
-        [Order(1)]
+        //[Order(1)]
         [Fact(DisplayName = "基础Api测试")]
         public async void BasicTest()
         {
@@ -59,7 +59,7 @@ namespace XUnitTest.Remoting
             Assert.Equal("Packet Api/Info2(Packet state)", apis[2]);
         }
 
-        [Order(2)]
+        //[Order(2)]
         [Theory(DisplayName = "参数测试")]
         [InlineData("12345678", "ABCDEFG")]
         [InlineData("ABCDEFG", "12345678")]
@@ -82,7 +82,7 @@ namespace XUnitTest.Remoting
             Assert.Null(infs["state2"]);
         }
 
-        [Order(3)]
+        //[Order(3)]
         [Fact(DisplayName = "二进制测试")]
         public async void Info2Test()
         {
@@ -99,7 +99,7 @@ namespace XUnitTest.Remoting
             Assert.Equal(buf, pk.Slice(pk.Total - buf.Length, -1).ToArray());
         }
 
-        [Order(4)]
+        //[Order(4)]
         [Fact(DisplayName = "异常请求")]
         public async void ErrorTest()
         {
修改 +0 -1
diff --git a/XUnitTest.Core/XUnitTest.Core.csproj b/XUnitTest.Core/XUnitTest.Core.csproj
index cdcb7cc..c9c9781 100644
--- a/XUnitTest.Core/XUnitTest.Core.csproj
+++ b/XUnitTest.Core/XUnitTest.Core.csproj
@@ -11,7 +11,6 @@
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
     <PackageReference Include="Moq" Version="4.13.1" />
     <PackageReference Include="xunit" Version="2.4.1" />
-    <PackageReference Include="Xunit.Extensions.Ordering" Version="1.4.5" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
修改 +6 -3
diff --git a/XUnitTest.XCode/XUnitTest.XCode.csproj b/XUnitTest.XCode/XUnitTest.XCode.csproj
index 306d802..a048fb5 100644
--- a/XUnitTest.XCode/XUnitTest.XCode.csproj
+++ b/XUnitTest.XCode/XUnitTest.XCode.csproj
@@ -4,9 +4,12 @@
     <IsPackable>false</IsPackable>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
-    <PackageReference Include="xunit" Version="2.4.0" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
+    <PackageReference Include="xunit" Version="2.4.1" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\NewLife.Core\NewLife.Core.csproj" />