C# Json 역정렬에서 키를 처리하는 특수 문자

8700 단어 json
다음과 같은 Json 데이터가 있다고 가정합니다.
view source
print
? 1. { 2. "id"   : 1, 3. "@value"   "this a @" , 4. "$p"   "my name a $" 5. }
일반적으로 Json이 반서열화될 때, Json을 서열화된 클래스에 비추어 이름을 지정할 필요가 없다.예컨대
view source
print
? 1. public   JsonTest{ 2. public   string   id{ get ; set ;} 3. }
Json의 ID는 반서열화할 때 클래스의 ID와 자동으로 대응합니다.
그러나 키에 특수 문자가 있을 때 $, @ 등은 클래스의 속성에 특수 문자를 정의할 수 없습니다.
따라서 [DataContract]와 [DataMember]를 사용해야 합니다.
데이터 협정을 정의하다.
view source
print
? 01. [DataContract] 02. public   class   jtest 03. { 04. [DataMember(Order = 0)] 05. public   int   id {  get set ; } 06. [DataMember(Order = 1, Name =  "@value" )] 07. public   string   value {  get set ; } 08. [DataMember(Order = 2, Name =  "$p" )] 09. public   string   _p {  get set ; } 10. }
역서열화
view source
print
? 1. jtest test = serializer.ReadObject( new   MemoryStream(Encoding.UTF8.GetBytes(jsonStr)))  as   jtest; 2. Console.WriteLine( test.value );
서열화
view source
print
? 1. var stream =  new   MemoryStream(); 2. serializer.WriteObject(stream, test); 3. byte [] dataBytes =  new   byte [stream.Length]; 4. stream.Position = 0; 5. stream.Read(dataBytes, 0, ( int )stream.Length); 6. string   dataString = Encoding.UTF8.GetString(dataBytes);
전체 테스트 클래스:
view source
print
? 01. using   System; 02. using   System.Text; 03. using   System.Runtime.Serialization; 04. using   System.Runtime.Serialization.Json; 05. using   System.IO; 06.
  07.
  08. namespace   ConsoleApplication1 09. { 10. class   Program 11. { 12. static   void   Main( string [] args) 13. { 14. string   jsonStr =  "{\"id\":1,\"@value\":\"this a @\",\"$p\":\"my name a $\"}" ; 15. DataContractJsonSerializer serializer =  new   DataContractJsonSerializer( typeof (jtest)); 16.
  17. // 18. jtest test = serializer.ReadObject( new   MemoryStream(Encoding.UTF8.GetBytes(jsonStr)))  as   jtest; 19. Console.WriteLine( test.value ); 20.
  21. // 22. var stream =  new   MemoryStream(); 23. serializer.WriteObject(stream, test); 24. byte [] dataBytes =  new   byte [stream.Length]; 25. stream.Position = 0; 26. stream.Read(dataBytes, 0, ( int )stream.Length); 27. string   dataString = Encoding.UTF8.GetString(dataBytes); 28.
  29. Console.WriteLine(dataString); 30. Console.ReadKey(); 31. } 32. } 33. [DataContract] 34. public   class   jtest 35. { 36. [DataMember(Order = 0)] 37. public   int   id {  get set ; } 38. [DataMember(Order = 1, Name =  "@value" )] 39. public   string   value {  get set ; } 40. [DataMember(Order = 2, Name =  "$p" )] 41. public   string   _p {  get set ; } 42. } 43. }

좋은 웹페이지 즐겨찾기