JsonObjectDataContract.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //----------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //----------------------------------------------------------------
  4. namespace System.Runtime.Serialization.Json
  5. {
  6. using System.Xml;
  7. using System.ServiceModel;
  8. using System.Runtime.Serialization;
  9. using System.Globalization;
  10. class JsonObjectDataContract : JsonDataContract
  11. {
  12. public JsonObjectDataContract(DataContract traditionalDataContract)
  13. : base(traditionalDataContract)
  14. {
  15. }
  16. public override object ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context)
  17. {
  18. object obj;
  19. string contentMode = jsonReader.GetAttribute(JsonGlobals.typeString);
  20. switch (contentMode)
  21. {
  22. case JsonGlobals.nullString:
  23. jsonReader.Skip();
  24. obj = null;
  25. break;
  26. case JsonGlobals.booleanString:
  27. obj = jsonReader.ReadElementContentAsBoolean();
  28. break;
  29. case JsonGlobals.stringString:
  30. case null:
  31. obj = jsonReader.ReadElementContentAsString();
  32. break;
  33. case JsonGlobals.numberString:
  34. obj = ParseJsonNumber(jsonReader.ReadElementContentAsString());
  35. break;
  36. case JsonGlobals.objectString:
  37. jsonReader.Skip();
  38. obj = new object();
  39. break;
  40. case JsonGlobals.arrayString:
  41. // Read as object array
  42. return DataContractJsonSerializer.ReadJsonValue(DataContract.GetDataContract(Globals.TypeOfObjectArray), jsonReader, context);
  43. default:
  44. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
  45. XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.JsonUnexpectedAttributeValue, contentMode)));
  46. }
  47. if (context != null)
  48. {
  49. context.AddNewObject(obj);
  50. }
  51. return obj;
  52. }
  53. public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle)
  54. {
  55. jsonWriter.WriteAttributeString(null, JsonGlobals.typeString, null, JsonGlobals.objectString);
  56. }
  57. internal static object ParseJsonNumber(string value, out TypeCode objectTypeCode)
  58. {
  59. if (value == null)
  60. {
  61. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(System.Runtime.Serialization.SR.GetString(System.Runtime.Serialization.SR.XmlInvalidConversion, value, Globals.TypeOfInt)));
  62. }
  63. if (value.IndexOfAny(JsonGlobals.floatingPointCharacters) == -1)
  64. {
  65. int intValue;
  66. if (Int32.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out intValue))
  67. {
  68. objectTypeCode = TypeCode.Int32;
  69. return intValue;
  70. }
  71. long longValue;
  72. if (Int64.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out longValue))
  73. {
  74. objectTypeCode = TypeCode.Int64;
  75. return longValue;
  76. }
  77. }
  78. decimal decimalValue;
  79. if (Decimal.TryParse(value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out decimalValue))
  80. {
  81. objectTypeCode = TypeCode.Decimal;
  82. //check for decimal underflow
  83. if (decimalValue == Decimal.Zero)
  84. {
  85. double doubleValue = XmlConverter.ToDouble(value);
  86. if (doubleValue != 0.0)
  87. {
  88. objectTypeCode = TypeCode.Double;
  89. return doubleValue;
  90. }
  91. }
  92. return decimalValue;
  93. }
  94. objectTypeCode = TypeCode.Double;
  95. return XmlConverter.ToDouble(value);
  96. }
  97. static object ParseJsonNumber(string value)
  98. {
  99. TypeCode unusedTypeCode;
  100. return ParseJsonNumber(value, out unusedTypeCode);
  101. }
  102. }
  103. }