You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
4.9 KiB

  1. #region License
  2. // Copyright (c) 2007 James Newton-King
  3. //
  4. // Permission is hereby granted, free of charge, to any person
  5. // obtaining a copy of this software and associated documentation
  6. // files (the "Software"), to deal in the Software without
  7. // restriction, including without limitation the rights to use,
  8. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the
  10. // Software is furnished to do so, subject to the following
  11. // conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be
  14. // included in all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  17. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  18. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  19. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  20. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  21. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23. // OTHER DEALINGS IN THE SOFTWARE.
  24. #endregion
  25. using System;
  26. using System.Collections.Generic;
  27. using System.Globalization;
  28. using System.IO;
  29. using System.Text;
  30. namespace Newtonsoft.Json.Serialization
  31. {
  32. internal class TraceJsonReader : JsonReader, IJsonLineInfo
  33. {
  34. private readonly JsonReader _innerReader;
  35. private readonly JsonTextWriter _textWriter;
  36. private readonly StringWriter _sw;
  37. public TraceJsonReader(JsonReader innerReader)
  38. {
  39. _innerReader = innerReader;
  40. _sw = new StringWriter(CultureInfo.InvariantCulture);
  41. // prefix the message in the stringwriter to avoid concat with a potentially large JSON string
  42. _sw.Write("Deserialized JSON: " + Environment.NewLine);
  43. _textWriter = new JsonTextWriter(_sw);
  44. _textWriter.Formatting = Formatting.Indented;
  45. }
  46. public string GetDeserializedJsonMessage()
  47. {
  48. return _sw.ToString();
  49. }
  50. public override bool Read()
  51. {
  52. bool value = _innerReader.Read();
  53. WriteCurrentToken();
  54. return value;
  55. }
  56. public override int? ReadAsInt32()
  57. {
  58. int? value = _innerReader.ReadAsInt32();
  59. WriteCurrentToken();
  60. return value;
  61. }
  62. public override string ReadAsString()
  63. {
  64. string value = _innerReader.ReadAsString();
  65. WriteCurrentToken();
  66. return value;
  67. }
  68. public override byte[] ReadAsBytes()
  69. {
  70. byte[] value = _innerReader.ReadAsBytes();
  71. WriteCurrentToken();
  72. return value;
  73. }
  74. public override decimal? ReadAsDecimal()
  75. {
  76. decimal? value = _innerReader.ReadAsDecimal();
  77. WriteCurrentToken();
  78. return value;
  79. }
  80. public override double? ReadAsDouble()
  81. {
  82. double? value = _innerReader.ReadAsDouble();
  83. WriteCurrentToken();
  84. return value;
  85. }
  86. public override bool? ReadAsBoolean()
  87. {
  88. bool? value = _innerReader.ReadAsBoolean();
  89. WriteCurrentToken();
  90. return value;
  91. }
  92. public override DateTime? ReadAsDateTime()
  93. {
  94. DateTime? value = _innerReader.ReadAsDateTime();
  95. WriteCurrentToken();
  96. return value;
  97. }
  98. #if !NET20
  99. public override DateTimeOffset? ReadAsDateTimeOffset()
  100. {
  101. DateTimeOffset? value = _innerReader.ReadAsDateTimeOffset();
  102. WriteCurrentToken();
  103. return value;
  104. }
  105. #endif
  106. public void WriteCurrentToken()
  107. {
  108. _textWriter.WriteToken(_innerReader, false, false, true);
  109. }
  110. public override int Depth => _innerReader.Depth;
  111. public override string Path => _innerReader.Path;
  112. public override char QuoteChar
  113. {
  114. get => _innerReader.QuoteChar;
  115. protected internal set => _innerReader.QuoteChar = value;
  116. }
  117. public override JsonToken TokenType => _innerReader.TokenType;
  118. public override object Value => _innerReader.Value;
  119. public override Type ValueType => _innerReader.ValueType;
  120. public override void Close()
  121. {
  122. _innerReader.Close();
  123. }
  124. bool IJsonLineInfo.HasLineInfo()
  125. {
  126. return _innerReader is IJsonLineInfo lineInfo && lineInfo.HasLineInfo();
  127. }
  128. int IJsonLineInfo.LineNumber
  129. {
  130. get
  131. {
  132. return (_innerReader is IJsonLineInfo lineInfo) ? lineInfo.LineNumber : 0;
  133. }
  134. }
  135. int IJsonLineInfo.LinePosition
  136. {
  137. get
  138. {
  139. return (_innerReader is IJsonLineInfo lineInfo) ? lineInfo.LinePosition : 0;
  140. }
  141. }
  142. }
  143. }