private JsonNode ReadValue()

in powershell/resources/runtime/csharp/json/Serialization/JsonSerializer.cs [288:340]


        private JsonNode ReadValue(TypeDetails type, object value)
        {
            if (value == null)
            {
                return XNull.Instance;
            }

            if (type.JsonConverter != null)
            {
                return type.JsonConverter.ToJson(value);
            }
            else if (type.IsArray)
            {
                switch (Type.GetTypeCode(type.ElementType))
                {
                    case TypeCode.String: return CreateArray((string[])value);
                    case TypeCode.UInt16: return CreateArray((ushort[])value);
                    case TypeCode.UInt32: return CreateArray((uint[])value);
                    case TypeCode.UInt64: return CreateArray((ulong[])value);
                    case TypeCode.Int16: return CreateArray((short[])value);
                    case TypeCode.Int32: return CreateArray((int[])value);
                    case TypeCode.Int64: return CreateArray((long[])value);
                    case TypeCode.Single: return CreateArray((float[])value);
                    case TypeCode.Double: return CreateArray((double[])value);
                    default: return ReadArray((IEnumerable)value);
                }
            }
            else if (value is IEnumerable)
            {
                if (type.IsList && type.ElementType != null)
                {
                    switch (Type.GetTypeCode(type.ElementType))
                    {
                        case TypeCode.String: return CreateList<string>(value);
                        case TypeCode.UInt16: return CreateList<ushort>(value);
                        case TypeCode.UInt32: return CreateList<uint>(value);
                        case TypeCode.UInt64: return CreateList<ulong>(value);
                        case TypeCode.Int16: return CreateList<short>(value);
                        case TypeCode.Int32: return CreateList<int>(value);
                        case TypeCode.Int64: return CreateList<long>(value);
                        case TypeCode.Single: return CreateList<float>(value);
                        case TypeCode.Double: return CreateList<double>(value);
                    }
                }

                return ReadArray((IEnumerable)value);
            }
            else
            {
                // Complex object
                return ReadObject(value);
            }
        }