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 26 #if !(SILVERLIGHT || NETFX_CORE) 27 using System; 28 using System.Globalization; 29 using System.Runtime.Serialization; 30 using Newtonsoft.Json.Utilities; 31 using Newtonsoft.Json.Linq; 32 33 namespace Newtonsoft.Json.Serialization 34 { 35 internal class JsonFormatterConverter : IFormatterConverter 36 { 37 private readonly JsonSerializer _serializer; 38 JsonFormatterConverter(JsonSerializer serializer)39 public JsonFormatterConverter(JsonSerializer serializer) 40 { 41 ValidationUtils.ArgumentNotNull(serializer, "serializer"); 42 43 _serializer = serializer; 44 } 45 GetTokenValue(object value)46 private T GetTokenValue<T>(object value) 47 { 48 ValidationUtils.ArgumentNotNull(value, "value"); 49 50 JValue v = (JValue)value; 51 return (T)System.Convert.ChangeType(v.Value, typeof(T), CultureInfo.InvariantCulture); 52 } 53 Convert(object value, Type type)54 public object Convert(object value, Type type) 55 { 56 ValidationUtils.ArgumentNotNull(value, "value"); 57 58 JToken token = value as JToken; 59 if (token == null) 60 throw new ArgumentException("Value is not a JToken.", "value"); 61 62 return _serializer.Deserialize(token.CreateReader(), type); 63 } 64 Convert(object value, TypeCode typeCode)65 public object Convert(object value, TypeCode typeCode) 66 { 67 ValidationUtils.ArgumentNotNull(value, "value"); 68 69 if (value is JValue) 70 value = ((JValue) value).Value; 71 72 return System.Convert.ChangeType(value, typeCode, CultureInfo.InvariantCulture); 73 } 74 ToBoolean(object value)75 public bool ToBoolean(object value) 76 { 77 return GetTokenValue<bool>(value); 78 } 79 ToByte(object value)80 public byte ToByte(object value) 81 { 82 return GetTokenValue<byte>(value); 83 } 84 ToChar(object value)85 public char ToChar(object value) 86 { 87 return GetTokenValue<char>(value); 88 } 89 ToDateTime(object value)90 public DateTime ToDateTime(object value) 91 { 92 return GetTokenValue<DateTime>(value); 93 } 94 ToDecimal(object value)95 public decimal ToDecimal(object value) 96 { 97 return GetTokenValue<decimal>(value); 98 } 99 ToDouble(object value)100 public double ToDouble(object value) 101 { 102 return GetTokenValue<double>(value); 103 } 104 ToInt16(object value)105 public short ToInt16(object value) 106 { 107 return GetTokenValue<short>(value); 108 } 109 ToInt32(object value)110 public int ToInt32(object value) 111 { 112 return GetTokenValue<int>(value); 113 } 114 ToInt64(object value)115 public long ToInt64(object value) 116 { 117 return GetTokenValue<long>(value); 118 } 119 ToSByte(object value)120 public sbyte ToSByte(object value) 121 { 122 return GetTokenValue<sbyte>(value); 123 } 124 ToSingle(object value)125 public float ToSingle(object value) 126 { 127 return GetTokenValue<float>(value); 128 } 129 ToString(object value)130 public string ToString(object value) 131 { 132 return GetTokenValue<string>(value); 133 } 134 ToUInt16(object value)135 public ushort ToUInt16(object value) 136 { 137 return GetTokenValue<ushort>(value); 138 } 139 ToUInt32(object value)140 public uint ToUInt32(object value) 141 { 142 return GetTokenValue<uint>(value); 143 } 144 ToUInt64(object value)145 public ulong ToUInt64(object value) 146 { 147 return GetTokenValue<ulong>(value); 148 } 149 } 150 } 151 #endif