11using Fluid . Filters ;
2+ using Fluid . Tests . Domain ;
23using Fluid . Values ;
34using Newtonsoft . Json . Linq ;
45using System ;
56using System . Globalization ;
67using System . Linq ;
78using System . Text . Encodings . Web ;
89using System . Text . Json ;
10+ using System . Text . Json . Serialization ;
911using System . Threading . Tasks ;
1012using TimeZoneConverter ;
1113using Xunit ;
@@ -693,59 +695,6 @@ public async Task Json(object value, string expected)
693695 Assert . Equal ( expected , result . ToStringValue ( ) ) ;
694696 }
695697
696- [ Fact ]
697- public async Task JsonShouldHideMembers ( )
698- {
699- var inputObject = new JsonAccessStrategy ( ) ;
700- var templateOptions = new TemplateOptions ( ) ;
701- templateOptions . MemberAccessStrategy . Register < JsonAccessStrategy , FluidValue > ( ( obj , name , context ) =>
702- {
703- return name switch
704- {
705- nameof ( JsonAccessStrategy . Visible ) => new StringValue ( obj . Visible ) ,
706- nameof ( JsonAccessStrategy . Null ) => new StringValue ( obj . Null ) ,
707- _ => NilValue . Instance
708- } ;
709- } ) ;
710-
711- var input = FluidValue . Create ( inputObject , templateOptions ) ;
712- var expected = "{\" Visible\" :\" Visible\" ,\" Null\" :\" \" }" ;
713-
714- var arguments = new FilterArguments ( ) ;
715- var context = new TemplateContext ( templateOptions ) ;
716-
717- var result = await MiscFilters . Json ( input , arguments , context ) ;
718-
719- Assert . Equal ( expected , result . ToStringValue ( ) ) ;
720- }
721-
722- [ Fact ]
723- public async Task JsonShouldHandleCircularReferences ( )
724- {
725- var model = TestObjects . RecursiveReferenceObject ;
726- var input = FluidValue . Create ( model , TemplateOptions . Default ) ;
727- var to = new TemplateOptions ( ) ;
728- to . MemberAccessStrategy . Register < TestObjects . Node > ( ) ;
729-
730- var result = await MiscFilters . Json ( input , new FilterArguments ( ) , new TemplateContext ( to ) ) ;
731-
732- Assert . Equal ( "{\" Name\" :\" Object1\" ,\" NodeRef\" :{\" Name\" :\" Child1\" ,\" NodeRef\" :\" Circular reference has been detected.\" }}" , result . ToStringValue ( ) ) ;
733- }
734-
735- [ Fact ]
736- public async Task JsonShouldHandleCircularReferencesOnSiblingPropertiesSeparately ( )
737- {
738- var model = TestObjects . SiblingPropertiesHaveSameReferenceObject ;
739- var input = FluidValue . Create ( model , TemplateOptions . Default ) ;
740- var to = new TemplateOptions ( ) ;
741- to . MemberAccessStrategy . Register < TestObjects . Node > ( ) ;
742- to . MemberAccessStrategy . Register < TestObjects . MultipleNode > ( ) ;
743-
744- var result = await MiscFilters . Json ( input , new FilterArguments ( ) , new TemplateContext ( to ) ) ;
745-
746- Assert . Equal ( "{\" Name\" :\" MultipleNode1\" ,\" Node1\" :{\" Name\" :\" Object1\" ,\" NodeRef\" :{\" Name\" :\" Child1\" ,\" NodeRef\" :\" Circular reference has been detected.\" }},\" Node2\" :{\" Name\" :\" Object1\" ,\" NodeRef\" :{\" Name\" :\" Child1\" ,\" NodeRef\" :\" Circular reference has been detected.\" }}}" , result . ToStringValue ( ) ) ;
747- }
748-
749698 [ Fact ]
750699 public async Task JsonShouldIgnoreStaticMembers ( )
751700 {
@@ -771,7 +720,7 @@ public async Task JsonShouldWriteNullIfDictionaryNotReturnFluidIndexable()
771720 options . MemberAccessStrategy . Register ( model . GetType ( ) ) ;
772721 var input = FluidValue . Create ( model , options ) ;
773722 var result = await MiscFilters . Json ( input , new FilterArguments ( ) , new TemplateContext ( options ) ) ;
774- Assert . Equal ( "{\" Id\" :1,\" WithoutIndexable\" :null ,\" Bool\" :true}" , result . ToStringValue ( ) ) ;
723+ Assert . Equal ( "{\" Id\" :1,\" WithoutIndexable\" :{ \" Type \" :5, \" Value \" :{}} ,\" Bool\" :true}" , result . ToStringValue ( ) ) ;
775724 }
776725
777726 [ Fact ]
@@ -815,7 +764,10 @@ public async Task JsonShouldUseJsonSerializerOption()
815764 {
816765 var options = new TemplateOptions
817766 {
818- JavaScriptEncoder = JavaScriptEncoder . UnsafeRelaxedJsonEscaping
767+ JsonSerializerOptions = new JsonSerializerOptions
768+ {
769+ Encoder = JavaScriptEncoder . UnsafeRelaxedJsonEscaping
770+ }
819771 } ;
820772
821773 var input = FluidValue . Create ( "你好,这是一条短信" , options ) ;
@@ -825,57 +777,37 @@ public async Task JsonShouldUseJsonSerializerOption()
825777 }
826778
827779 [ Fact ]
828- public async Task JsonShouldUseJsonWriterOptionsFromTemplateOptions ( )
780+ public async Task JsonShouldSerializeEnumsAsNumbers ( )
829781 {
830- var options = new TemplateOptions
831- {
832- JsonWriterOptions = new JsonWriterOptions
833- {
834- Indented = true
835- }
836- } ;
782+ var options = new TemplateOptions ( ) ;
783+ options . MemberAccessStrategy . Register < Domain . Colors > ( ) ;
837784
838- var input = FluidValue . Create ( new { name = "test" , value = 123 } , options ) ;
839- options . MemberAccessStrategy . Register ( input . ToObjectValue ( ) . GetType ( ) ) ;
785+ var input = FluidValue . Create ( Domain . Colors . Red , options ) ;
840786 var context = new TemplateContext ( options ) ;
841787 var result = await MiscFilters . Json ( input , new FilterArguments ( ) , context ) ;
842788
843- // Indented JSON should have newlines
844- Assert . Contains ( " \n ", result . ToStringValue ( ) ) ;
789+ // Enum should be serialized as number (1 for Red)
790+ Assert . Equal ( "1 ", result . ToStringValue ( ) ) ;
845791 }
846-
792+
847793 [ Fact ]
848- public async Task JsonShouldUseJsonWriterOptionsFromTemplateContext ( )
794+ public async Task JsonShouldSerializeEnumsAsStrings ( )
849795 {
850- var options = new TemplateOptions ( ) ;
851- var context = new TemplateContext ( options )
796+ var options = new TemplateOptions
852797 {
853- JsonWriterOptions = new JsonWriterOptions
798+ JsonSerializerOptions = new JsonSerializerOptions
854799 {
855- Indented = true
800+ Converters = { new JsonStringEnumConverter ( ) }
856801 }
857802 } ;
803+ options . MemberAccessStrategy . Register < Person > ( ) ;
858804
859- var input = FluidValue . Create ( new { name = "test" , value = 123 } , options ) ;
860- options . MemberAccessStrategy . Register ( input . ToObjectValue ( ) . GetType ( ) ) ;
861- var result = await MiscFilters . Json ( input , new FilterArguments ( ) , context ) ;
862-
863- // Indented JSON should have newlines
864- Assert . Contains ( "\n " , result . ToStringValue ( ) ) ;
865- }
866-
867- [ Fact ]
868- public async Task JsonShouldSerializeEnumsAsNumbers ( )
869- {
870- var options = new TemplateOptions ( ) ;
871- options . MemberAccessStrategy . Register < TestEnum > ( ) ;
872-
873- var input = FluidValue . Create ( TestEnum . Value2 , options ) ;
805+ var input = FluidValue . Create ( new Person { EyesColor = Colors . Red } , options ) ;
874806 var context = new TemplateContext ( options ) ;
875807 var result = await MiscFilters . Json ( input , new FilterArguments ( ) , context ) ;
876808
877- // Enum should be serialized as number (1 for Value2 )
878- Assert . Equal ( "1 " , result . ToStringValue ( ) ) ;
809+ // Enum should be serialized as string ("Red" )
810+ Assert . Equal ( "{ \" Firstname \" :null, \" Lastname \" :null, \" EyesColor \" : \" Red \" , \" Address \" :null} " , result . ToStringValue ( ) ) ;
879811 }
880812
881813 [ Theory ]
@@ -1084,12 +1016,5 @@ public DictionaryWithoutIndexableTestObjects(object value) : base(value)
10841016
10851017 }
10861018 }
1087-
1088- private enum TestEnum
1089- {
1090- Value1 = 0 ,
1091- Value2 = 1 ,
1092- Value3 = 2
1093- }
10941019 }
10951020}
0 commit comments