public static void UnicodePropertyNames() { { ClassWithUnicodeProperty obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>("{\"A\u0467\":1}"); Assert.Equal(1, obj.A\u0467); // Verify the name is escaped after serialize. string json = JsonSerializer.Serialize(obj); Assert.Contains(@"""A\u0467"":1", json); // Verify the name is unescaped after deserialize. obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json); Assert.Equal(1, obj.A\u0467); } { // We want to go over StackallocThreshold=256 to force a pooled allocation, so this property is 400 chars and 401 bytes. ClassWithUnicodeProperty obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>("{\"A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\":1}"); Assert.Equal(1, obj.A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890); // Verify the name is escaped after serialize. string json = JsonSerializer.Serialize(obj); Assert.Contains(@"""A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"":1", json); // Verify the name is unescaped after deserialize. obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json); Assert.Equal(1, obj.A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890); } }
public static void UnicodePropertyNames() { ClassWithUnicodeProperty obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>("{\"A\u0467\":1}"); Assert.Equal(1, obj.A\u0467); // Specifying encoder on options does not impact deserialize. var options = new JsonSerializerOptions(); options.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>("{\"A\u0467\":1}", options); Assert.Equal(1, obj.A\u0467); string json; // Verify the name is escaped after serialize. json = JsonSerializer.Serialize(obj); Assert.Contains(@"""A\u0467"":1", json); // With custom escaper json = JsonSerializer.Serialize(obj, options); Assert.Contains("\"A\u0467\":1", json); // Verify the name is unescaped after deserialize. obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json); Assert.Equal(1, obj.A\u0467); // With custom escaper obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json, options); Assert.Equal(1, obj.A\u0467); }
public static void UnicodePropertyNames() { ClassWithUnicodeProperty obj = new ClassWithUnicodeProperty { A\u0467 = 1 }; // Verify the name is escaped after serialize. string json = JsonSerializer.Serialize(obj, s_serializerOptionsPreserve); Assert.StartsWith("{\"$id\":\"1\",", json); Assert.Contains(@"""A\u0467"":1", json); // Round-trip ClassWithUnicodeProperty objCopy = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json, s_serializerOptionsPreserve); Assert.Equal(1, objCopy.A\u0467); // With custom escaper // Specifying encoder on options does not impact deserialize. var optionsWithEncoder = new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, ReferenceHandler = ReferenceHandler.Preserve }; json = JsonSerializer.Serialize(obj, optionsWithEncoder); Assert.StartsWith("{\"$id\":\"1\",", json); Assert.Contains("\"A\u0467\":1", json); // Round-trip objCopy = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json, optionsWithEncoder); Assert.Equal(1, objCopy.A\u0467); // We want to go over StackallocThreshold=256 to force a pooled allocation, so this property is 400 chars and 401 bytes. obj = new ClassWithUnicodeProperty { A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 = 1 }; // Verify the name is escaped after serialize. json = JsonSerializer.Serialize(obj, s_serializerOptionsPreserve); Assert.StartsWith("{\"$id\":\"1\",", json); Assert.Contains(@"""A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"":1", json); // Round-trip objCopy = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json, s_serializerOptionsPreserve); Assert.Equal(1, objCopy.A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890); // With custom escaper json = JsonSerializer.Serialize(obj, optionsWithEncoder); Assert.StartsWith("{\"$id\":\"1\",", json); Assert.Contains("\"A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\":1", json); // Round-trip objCopy = JsonSerializer.Deserialize <ClassWithUnicodeProperty>(json, optionsWithEncoder); Assert.Equal(1, objCopy.A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890); }
public static void EscapingFails() { try { ClassWithUnicodeProperty obj = JsonSerializer.Deserialize <ClassWithUnicodeProperty>("{\"A\u0467\":bad}"); Assert.True(false, "Expected JsonException was not thrown."); } catch (JsonException e) { Assert.Equal("$.A\u0467", e.Path); } }
public async Task UnicodePropertyNamesWithPooledAlloc() { // We want to go over StackallocByteThreshold=256 to force a pooled allocation, so this property is 400 chars and 401 bytes. ClassWithUnicodeProperty obj = await JsonSerializerWrapperForString.DeserializeWrapper <ClassWithUnicodeProperty>("{\"A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\":1}"); Assert.Equal(1, obj.A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890); // Verify the name is escaped after serialize. string json = await JsonSerializerWrapperForString.SerializeWrapper(obj); Assert.Contains(@"""A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"":1", json); // Verify the name is unescaped after deserialize. obj = await JsonSerializerWrapperForString.DeserializeWrapper <ClassWithUnicodeProperty>(json); Assert.Equal(1, obj.A\u046734567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890); }