Beispiel #1
0
        internal void SetValue(object item, IJsonValue value)
        {
            // clunky and basic primitive conversion...
            object toSet = null;

            if (value.ValueType == JsonValueType.String)
            {
                toSet = value.GetString();
            }
            else if (value.ValueType == JsonValueType.Number)
            {
                toSet = value.GetNumber();
            }
            else if (value.ValueType == JsonValueType.Boolean)
            {
                toSet = value.GetBoolean();
            }
            else
            {
                throw new NotSupportedException(string.Format("Cannot handle '{0}'.", value.ValueType));
            }

            // convert to the target type and set...
            toSet = Convert.ChangeType(toSet, this.Property.PropertyType);
            this.Property.SetValue(item, toSet);
        }
        public static object[] ToObjectArray(this IJsonValue v)
        {
            List <object> result = new List <object>();

            switch (v.ValueType)
            {
            case JsonValueType.Boolean:
                result.Add(v.GetBoolean());
                break;

            case JsonValueType.Null:
                result.Add(null);
                break;

            case JsonValueType.Number:
                result.Add(v.GetNumber());
                break;

            case JsonValueType.String:
                result.Add(v.GetString());
                break;

            case JsonValueType.Array:
                result.Add(v.GetArray().ToObjectArray());
                break;
            }

            return(result.ToArray());
        }
Beispiel #3
0
 dynamic Convert(IJsonValue json)
 {
     dynamic obj = null;
     switch (json.ValueType)
     {
         case JsonValueType.Array:
             obj = ConvertArray(json.GetArray());
             break;
         case JsonValueType.Boolean:
             obj = json.GetBoolean();
             break;
         case JsonValueType.Null:
             obj = null;
             break;
         case JsonValueType.Number:
             obj = json.GetNumber();
             break;
         case JsonValueType.Object:
             obj = new JsonToDynamic(json.GetObject());
             break;
         case JsonValueType.String:
             obj = json.GetString();
             break;
     }
     return obj;
 }
Beispiel #4
0
        private void Process(out JsonObject jsonObj, IJsonValue jsonData)
        {
            switch (jsonData.ValueType)
            {
            case JsonValueType.Null:
                jsonObj = new JsonObject();
                break;

            case JsonValueType.Boolean:
                jsonObj = new JsonObject(jsonData.GetBoolean());
                break;

            case JsonValueType.Number:
                jsonObj = new JsonObject(jsonData.GetNumber());
                break;

            case JsonValueType.String:
                jsonObj = new JsonObject(jsonData.GetString());
                break;

            case JsonValueType.Array:
                jsonObj = new JsonObject(JsonObjectType.Array);
                ProcessArray(jsonObj, jsonData.GetArray());
                break;

            case JsonValueType.Object:
                jsonObj = new JsonObject(JsonObjectType.Object);
                ProcessObject(jsonObj, jsonData.GetObject());
                break;

            default:
                throw new Exception("意外情况");
            }
        }
Beispiel #5
0
        internal static object ValueToObject(IJsonValue value)
        {
            switch (value.ValueType)
            {
            case JsonValueType.Null:
                return(null);

            case JsonValueType.Boolean:
                return(value.GetBoolean());

            case JsonValueType.Number:
                return(value.GetNumber());

            case JsonValueType.String:
                return(value.GetString());

            case JsonValueType.Object:
                return(new JsonPropertyProvider(value.GetObject()));

            case JsonValueType.Array:
                return(new JsonVectorView(value.GetArray()));

            default:
                throw new ArgumentException();
            }
        }
        public void Bool_ToJsonValue()
        {
            IJsonValue jsonValue = true.ToJsonValue();

            (jsonValue == null).ShouldBeEquivalentTo(false);
            jsonValue.ValueType.ShouldBeEquivalentTo(JsonValueType.Boolean);
            jsonValue.GetBoolean().ShouldBeEquivalentTo(true);
        }
 private void WriteJsonValue(JsonWriter writer, IJsonValue value)
 {
     switch (value.ValueType)
     {
         case JsonValueType.Array:
         {
             JsonArray a = value.GetArray();
             writer.WriteStartArray();
             for (int i = 0; i < a.Count; i++)
             {
                 WriteJsonValue(writer, a[i]);
             }
             writer.WriteEndArray();
         }
             break;
         case JsonValueType.Boolean:
         {
             writer.WriteValue(value.GetBoolean());
         }
             break;
         case JsonValueType.Null:
         {
             writer.WriteNull();
         }
             break;
         case JsonValueType.Number:
         {
             // JsonValue doesn't support integers
             // serialize whole numbers without a decimal point
             double d = value.GetNumber();
             bool isInteger = (d % 1 == 0);
             if (isInteger && d <= long.MaxValue && d >= long.MinValue)
                 writer.WriteValue(Convert.ToInt64(d));
             else
                 writer.WriteValue(d);
         }
             break;
         case JsonValueType.Object:
         {
             JsonObject o = value.GetObject();
             writer.WriteStartObject();
             foreach (KeyValuePair<string, IJsonValue> v in o)
             {
                 writer.WritePropertyName(v.Key);
                 WriteJsonValue(writer, v.Value);
             }
             writer.WriteEndObject();
         }
             break;
         case JsonValueType.String:
         {
             writer.WriteValue(value.GetString());
         }
             break;
         default:
             throw new ArgumentOutOfRangeException("ValueType");
     }
 }
        private void WriteJsonValue(JsonWriter writer, IJsonValue value)
        {
            switch (value.ValueType)
            {
            case JsonValueType.Array:
            {
                JsonArray a = value.GetArray();
                writer.WriteStartArray();
                for (int i = 0; i < a.Count; i++)
                {
                    WriteJsonValue(writer, a[i]);
                }
                writer.WriteEndArray();
            }
            break;

            case JsonValueType.Boolean:
            {
                writer.WriteValue(value.GetBoolean());
            }
            break;

            case JsonValueType.Null:
            {
                writer.WriteNull();
            }
            break;

            case JsonValueType.Number:
            {
                writer.WriteValue(value.GetNumber());
            }
            break;

            case JsonValueType.Object:
            {
                JsonObject o = value.GetObject();
                writer.WriteStartObject();
                foreach (KeyValuePair <string, IJsonValue> v in o)
                {
                    writer.WritePropertyName(v.Key);
                    WriteJsonValue(writer, v.Value);
                }
                writer.WriteEndObject();
            }
            break;

            case JsonValueType.String:
            {
                writer.WriteValue(value.GetString());
            }
            break;

            default:
                throw new ArgumentOutOfRangeException("ValueType");
            }
        }
Beispiel #9
0
        private static object _jsonDeserialize_convert(IJsonValue json)
        {
            object obj = null;

            switch (json.ValueType)
            {
            case JsonValueType.Array:
                JsonArray jsonArray = json.GetArray();
                object[]  objArray  = new object[jsonArray.Count];
                for (int i1 = 0; i1 < jsonArray.Count; i1++)
                {
                    objArray[i1] = _jsonDeserialize_convert(jsonArray[i1]);
                }
                obj = objArray;
                break;

            case JsonValueType.Boolean:
                obj = json.GetBoolean();
                break;

            case JsonValueType.Null:
                obj = null;
                break;

            case JsonValueType.Number:
                obj = json.GetNumber();
                break;

            case JsonValueType.Object:
                JsonObject jsonObject = json.GetObject();

                Dictionary <string, object> d = new Dictionary <string, object>();

                List <string> keys = new List <string>();
                foreach (var key in jsonObject.Keys)
                {
                    keys.Add(key);
                }

                int i2 = 0;
                foreach (var item in jsonObject.Values)
                {
                    d.Add(keys[i2], _jsonDeserialize_convert(item));
                    i2++;
                }
                obj = d;
                break;

            case JsonValueType.String:
                obj = json.GetString();
                break;
            }
            return(obj);
        }
Beispiel #10
0
        private static void PrettyPrintValue(StringBuilder builder, IJsonValue jsonValue, int indent)
        {
            switch (jsonValue.ValueType)
            {
            case JsonValueType.String:
                builder.Append($"\"{jsonValue.GetString()}\"");
                break;

            case JsonValueType.Boolean:
                builder.Append($"{jsonValue.GetBoolean()}");
                break;

            case JsonValueType.Number:
                builder.Append($"{jsonValue.GetNumber()}");
                break;

            case JsonValueType.Null:
                builder.Append($"null");
                break;

            case JsonValueType.Object:
                builder.Append("{\r\n");
                indent++;
                foreach (var item in jsonValue.GetObject())    //doesn't preserve order
                {
                    Tabs(builder, indent);
                    builder.Append($"\"{item.Key}\": ");
                    PrettyPrintValue(builder, (item.Value), indent);
                }
                RemoveLastComma(builder);
                indent--;
                Tabs(builder, indent);
                builder.Append("}");
                break;

            case JsonValueType.Array:
                builder.Append("[\r\n");
                indent++;
                foreach (IJsonValue value in jsonValue.GetArray())
                {
                    Tabs(builder, indent);
                    PrettyPrintValue(builder, value, indent);
                }
                RemoveLastComma(builder);
                indent--;
                Tabs(builder, indent);
                builder.Append("]");
                break;
            }
            builder.Append(",\r\n");
        }
 private void WriteJsonValue(JsonWriter writer, IJsonValue value)
 {
   switch (value.ValueType)
   {
     case JsonValueType.Array:
       {
         JsonArray a = value.GetArray();
         writer.WriteStartArray();
         for (int i = 0; i < a.Count; i++)
         {
           WriteJsonValue(writer, a[i]);
         }
         writer.WriteEndArray();
       }
       break;
     case JsonValueType.Boolean:
       {
         writer.WriteValue(value.GetBoolean());
       }
       break;
     case JsonValueType.Null:
       {
         writer.WriteNull();
       }
       break;
     case JsonValueType.Number:
       {
         writer.WriteValue(value.GetNumber());
       }
       break;
     case JsonValueType.Object:
       {
         JsonObject o = value.GetObject();
         writer.WriteStartObject();
         foreach (KeyValuePair<string, IJsonValue> v in o)
         {
           writer.WritePropertyName(v.Key);
           WriteJsonValue(writer, v.Value);
         }
         writer.WriteEndObject();
       }
       break;
     case JsonValueType.String:
       {
         writer.WriteValue(value.GetString());
       }
       break;
     default:
       throw new ArgumentOutOfRangeException("ValueType");
   }
 }
        private static object _jsonDeserialize_convert(IJsonValue json)
        {
            object obj = null;
            switch (json.ValueType)
            {
                case JsonValueType.Array:
                    JsonArray jsonArray = json.GetArray();
                    object[] objArray = new object[jsonArray.Count];
                    for (int i1 = 0; i1 < jsonArray.Count; i1++)
                    {
                        objArray[i1] = _jsonDeserialize_convert(jsonArray[i1]);
                    }
                    obj = objArray;
                    break;
                case JsonValueType.Boolean:
                    obj = json.GetBoolean();
                    break;
                case JsonValueType.Null:
                    obj = null;
                    break;
                case JsonValueType.Number:
                    obj = json.GetNumber();
                    break;
                case JsonValueType.Object:
                    JsonObject jsonObject = json.GetObject();

                    Dictionary<string, object> d = new Dictionary<string, object>();

                    List<string> keys = new List<string>();
                    foreach (var key in jsonObject.Keys)
                    {
                        keys.Add(key);
                    }

                    int i2 = 0;
                    foreach (var item in jsonObject.Values)
                    {
                        d.Add(keys[i2], _jsonDeserialize_convert(item));
                        i2++;
                    }
                    obj = d;
                    break;
                case JsonValueType.String:
                    obj = json.GetString();
                    break;
            }
            return obj;
        }
Beispiel #13
0
 private static bool ParseAsBoolean(IJsonValue jsonValue, bool defaultValue = false)
 {
     if (jsonValue.ValueType == JsonValueType.Boolean)
     {
         return(jsonValue.GetBoolean());
     }
     else if (jsonValue.ValueType == JsonValueType.String)
     {
         bool rv;
         if (!Boolean.TryParse(jsonValue.GetString(), out rv))
         {
             return(defaultValue);
         }
         return(rv);
     }
     else
     {
         return(defaultValue);
     }
 }
Beispiel #14
0
        private void RenderValue(IJsonValue json, double indent)
        {
            switch (json.ValueType)
            {
            case JsonValueType.Array:
                RenderArray(json.GetArray(), indent);
                break;

            case JsonValueType.Object:
                RenderObject(json.GetObject(), indent);
                break;

            case JsonValueType.Null:
                AddInlines(new Run()
                {
                    Text = "null", FontStyle = Windows.UI.Text.FontStyle.Italic, Foreground = BooleanBrush
                });
                break;

            case JsonValueType.Number:
                AddInlines(new Run()
                {
                    Text = json.GetNumber().ToString(), Foreground = NumberBrush
                });
                break;

            case JsonValueType.String:
                AddInlines(new Run()
                {
                    Text = "\"" + json.GetString() + "\"", Foreground = StringBrush
                });
                break;

            case JsonValueType.Boolean:
                AddInlines(new Run()
                {
                    Text = json.GetBoolean().ToString(), Foreground = BooleanBrush
                });
                break;
            }
        }
Beispiel #15
0
        public static string GetValueString(this IJsonValue value)
        {
            StringBuilder builder;

            switch (value.ValueType)
            {
            case JsonValueType.String:
                return(value.GetString());

            case JsonValueType.Boolean:
                return(value.GetBoolean().ToString());

            case JsonValueType.Number:
                return(value.GetNumber().ToString());

            case JsonValueType.Array:
                builder = new StringBuilder();
                foreach (IJsonValue item in value.GetArray())
                {
                    builder.AppendLine(GetValueString(item));
                }
                return(builder.ToString());

            case JsonValueType.Object:
                builder = new StringBuilder();
                foreach (IJsonValue item in value.GetObject().Values)
                {
                    builder.AppendLine(GetValueString(item));
                }
                return(builder.ToString());

            case JsonValueType.Null:
            default:
                return(null);
            }
        }
Beispiel #16
0
        private Score getScoreFromJson(string jsonString)
        {
            JsonObject jsonObject = new JsonObject();
            Score      score      = new Score();

            if (JsonObject.TryParse(jsonString, out jsonObject))
            {
                var        by    = jsonObject.GetNamedObject("by");
                IJsonValue value = null;
                try
                {
                    score.Id              = (jsonObject.TryGetValue("id", out value)) ? (int.Parse(value.GetNumber().ToString())) : (0);
                    score.Title           = (jsonObject.TryGetValue("title", out value)) ? (value.GetString()) : ("");
                    score.LocationProject = (jsonObject.TryGetValue("location_project", out value)) ? ((value.ValueType != JsonValueType.Null) ? (value.GetString()) : ("")) : ("");
                    score.LocationPreview = (jsonObject.TryGetValue("location_preview", out value)) ? ((value.ValueType != JsonValueType.Null) ? (value.GetString()) : ("")) : ("");
                    score.Is_Favourite    = (jsonObject.TryGetValue("is_favourite", out value)) ? (value.GetBoolean()) : (false);

                    score.Compositor.PersonalData.Id       = (by.TryGetValue("id", out value)) ? (int.Parse(value.GetString())) : (0);
                    score.Compositor.PersonalData.Username = (by.TryGetValue("username", out value)) ? (value.GetString()) : ("");
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine(e.Message);
                    throw;
                }
            }
            return(score);
        }
Beispiel #17
0
        private void WriteJsonValue(JsonWriter writer, IJsonValue value)
        {
            switch (value.ValueType)
            {
            case JsonValueType.Array:
            {
                JsonArray a = value.GetArray();
                writer.WriteStartArray();
                for (int i = 0; i < a.Count; i++)
                {
                    WriteJsonValue(writer, a[i]);
                }
                writer.WriteEndArray();
            }
            break;

            case JsonValueType.Boolean:
            {
                writer.WriteValue(value.GetBoolean());
            }
            break;

            case JsonValueType.Null:
            {
                writer.WriteNull();
            }
            break;

            case JsonValueType.Number:
            {
                // JsonValue doesn't support integers
                // serialize whole numbers without a decimal point
                double d         = value.GetNumber();
                bool   isInteger = (d % 1 == 0);
                if (isInteger && d <= long.MaxValue && d >= long.MinValue)
                {
                    writer.WriteValue(Convert.ToInt64(d));
                }
                else
                {
                    writer.WriteValue(d);
                }
            }
            break;

            case JsonValueType.Object:
            {
                JsonObject o = value.GetObject();
                writer.WriteStartObject();
                foreach (KeyValuePair <string, IJsonValue> v in o)
                {
                    writer.WritePropertyName(v.Key);
                    WriteJsonValue(writer, v.Value);
                }
                writer.WriteEndObject();
            }
            break;

            case JsonValueType.String:
            {
                writer.WriteValue(value.GetString());
            }
            break;

            default:
                throw new ArgumentOutOfRangeException("ValueType");
            }
        }
Beispiel #18
0
        private static bool JsonComparesEqual(IJsonValue expected, IJsonValue actual, string keyName)
        {
            const string Anything = "<ANYTHING>";

            if (expected.ValueType == JsonValueType.String && Regex.Replace(expected.GetString(), @"\p{C}", "") == Anything)
            {
                Debug.WriteLine($"Skipping ignored value: {actual.ValueType} {actual}");
                return(true);
            }
            //Debug.WriteLine($"keyname: {keyName} {expected.ValueType} {actual.ValueType}");
            if (expected.ValueType != actual.ValueType)
            {
                Debug.WriteLine($"Expected {expected} got {actual}");
                return(false);
            }
            switch (expected.ValueType)
            {
            case JsonValueType.String:
                if (expected.GetString() != actual.GetString())
                {
                    Debug.WriteLine($"string:Expected {expected.GetString()} got {actual.GetString()}");
                    return(false);
                }
                return(true);

            case JsonValueType.Number:
                if (Math.Abs(expected.GetNumber() - actual.GetNumber()) > epsilon)
                {
                    Debug.WriteLine($"number: {keyName} {expected.GetNumber()} {actual.GetNumber()}");
                    return(false);
                }
                return(true);

            case JsonValueType.Boolean:
                return(expected.GetBoolean() == actual.GetBoolean());

            case JsonValueType.Null:
                return(true);

            case JsonValueType.Array:
            {
                var ea = expected.GetArray();
                var aa = actual.GetArray();
                if (!JsonCompareArray(ea, aa))
                {
                    Debug.WriteLine("in key " + keyName);
                    return(false);
                }
                return(true);
            }

            case JsonValueType.Object:
            {
                if (!JsonCompareObject(expected.GetObject(), actual.GetObject()))
                {
                    Debug.WriteLine("in key " + keyName);
                    return(false);
                }
                return(true);
            }

            default:
                throw new ArgumentException();
            }
        }
Beispiel #19
0
        public static object ToObject(this IJsonValue value, Type targetType)
        {
            if (value.GetType() == targetType)
            {
                return(value);
            }

            if (value.ValueType == JsonValueType.Null)
            {
                return(null);
            }

            if (targetType == typeof(JsonObject))
            {
                return(JsonObject.Parse(value.Stringify()));
            }

            if (typeof(IJsonValue).IsAssignableFrom(targetType))
            {
                return(value);
            }

            if (targetType == typeof(string))
            {
                return(value.GetString());
            }

            if (targetType == typeof(int) || targetType == typeof(int?))
            {
                return((int)value.GetNumber());
            }

            if (targetType == typeof(long) || targetType == typeof(long?))
            {
                return((long)value.GetNumber());
            }

            if (targetType == typeof(bool) || targetType == typeof(bool?))
            {
                return(value.GetBoolean());
            }

            if (targetType == typeof(float) || targetType == typeof(float?))
            {
                return((float)value.GetNumber());
            }

            if (targetType == typeof(double) || targetType == typeof(double?))
            {
                return(value.GetNumber());
            }

            if (targetType == typeof(decimal) || targetType == typeof(decimal?))
            {
                return((decimal)value.GetNumber());
            }

            if (targetType == typeof(DateTime) || targetType == typeof(DateTime?))
            {
                return(DateTime.Parse(value.GetString()));
            }

            if (targetType == typeof(TimeSpan) || targetType == typeof(TimeSpan?))
            {
                return(TimeSpan.Parse(value.GetString()));
            }

            throw new NotSupportedException($"Type {targetType} is not supported.");
        }
Beispiel #20
0
 private void RenderValue(IJsonValue json, double indent)
 {
     switch (json.ValueType)
     {
         case JsonValueType.Array:
             RenderArray(json.GetArray(), indent);
             break;
         case JsonValueType.Object:
             RenderObject(json.GetObject(), indent);
             break;
         case JsonValueType.Null:
             AddInlines(new Run() { Text = "null", FontStyle = Windows.UI.Text.FontStyle.Italic, Foreground = BooleanBrush });
             break;
         case JsonValueType.Number:
             AddInlines(new Run() { Text = json.GetNumber().ToString(), Foreground = NumberBrush });
             break;
         case JsonValueType.String:
             AddInlines(new Run() { Text = "\"" + json.GetString() + "\"", Foreground = StringBrush });
             break;
         case JsonValueType.Boolean:
             AddInlines(new Run() { Text = json.GetBoolean().ToString(), Foreground = BooleanBrush });
             break;
     }
 }
Beispiel #21
0
        private User getUserFromJson(string jsonString)
        {
            JsonObject jsonObject = new JsonObject();
            User       user       = new User();

            if (JsonObject.TryParse(jsonString, out jsonObject))
            {
                IJsonValue value = null;
                try
                {
                    user.PersonalData.Id         = (jsonObject.TryGetValue("id", out value)) ? (int.Parse(value.GetString())) : (0);
                    user.PersonalData.Username   = (jsonObject.TryGetValue("username", out value)) ? (value.GetString()) : ("");
                    user.PersonalData.FirstName  = (jsonObject.TryGetValue("firstname", out value)) ? ((value.ValueType != JsonValueType.Null) ? (value.GetString()) : ("")) : ("");
                    user.PersonalData.Lastname   = (jsonObject.TryGetValue("lastname", out value)) ? ((value.ValueType != JsonValueType.Null) ? (value.GetString()) : ("")) : ("");
                    user.PersonalData.Message    = (jsonObject.TryGetValue("message", out value)) ? ((value.ValueType != JsonValueType.Null) ? (value.GetString()) : ("")) : ("");
                    user.PersonalData.Email      = (jsonObject.TryGetValue("email", out value)) ? ((value.ValueType != JsonValueType.Null) ? (value.GetString()) : ("")) : ("");
                    user.PersonalData.PictureURL = (jsonObject.TryGetValue("photo", out value)) ? (value.GetString()) : ("");
                    user.isASubscription         = (jsonObject.TryGetValue("is_subscription", out value)) ? (value.GetBoolean()) : (false);
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine(e.Message);
                    throw;
                }
            }
            return(user);
        }
Beispiel #22
0
 private static bool ParseAsBoolean(IJsonValue jsonValue, bool defaultValue = false)
 {
     if (jsonValue.ValueType == JsonValueType.Boolean)
     {
         return jsonValue.GetBoolean();
     }
     else if (jsonValue.ValueType == JsonValueType.String)
     {
         bool rv;
         if (!Boolean.TryParse(jsonValue.GetString(), out rv))
             return defaultValue;
         return rv;
     }
     else
     {
         return defaultValue;
     }
 }
Beispiel #23
0
        static public object Convert(ITypeDefinition type, IJsonValue val)
        {
            try
            {
                switch (type.Type)
                {
                case TypeId.Boolean:
                    return(val.GetBoolean());

                case TypeId.Double:
                    return(val.GetNumber());

                case TypeId.Dictionary:
                    return(val.GetArray()
                           .ToList()
                           .Select(x =>
                                   new KeyValuePair <object, object>(
                                       Convert(type.KeyType, x.GetArray()[0]),
                                       Convert(type.ValueType, x.GetArray()[1])
                                       )
                                   ));

                case TypeId.Signature:
                    return(val.GetString());

                case TypeId.Int32:
                    return((Int32)val.GetNumber());

                case TypeId.Int16:
                    return((Int16)val.GetNumber());

                case TypeId.ObjectPath:
                    return(val.GetString());

                case TypeId.Uint16:
                    return((UInt16)val.GetNumber());

                case TypeId.Struct:
                    return(ConvertStruct(type, val));

                case TypeId.String:
                    return(val.GetString());

                case TypeId.Uint64:
                    return((UInt64)val.GetNumber());

                case TypeId.Uint32:
                    return((UInt32)val.GetNumber());

                case TypeId.Variant:
                    return(ConvertVariant(val));

                case TypeId.Int64:
                    return((Int64)val.GetNumber());

                case TypeId.Uint8:
                    return((byte)val.GetNumber());

                case TypeId.BooleanArray:
                    return(val.GetArray().Select(x => x.GetBoolean()).Cast <object>().ToList());

                case TypeId.DoubleArray:
                    return(val.GetArray().Select(x => x.GetNumber()).Cast <object>().ToList());

                case TypeId.Int32Array:
                    return(val.GetArray().Select(x => (Int32)x.GetNumber()).Cast <object>().ToList());

                case TypeId.Int16Array:
                    return(val.GetArray().Select(x => (Int16)x.GetNumber()).Cast <object>().ToList());

                case TypeId.Uint16Array:
                    return(val.GetArray().Select(x => (UInt16)x.GetNumber()).Cast <object>().ToList());

                case TypeId.Uint64Array:
                    return(val.GetArray().Select(x => (UInt64)x.GetNumber()).Cast <object>().ToList());

                case TypeId.Uint32Array:
                    return(val.GetArray().Select(x => (UInt32)x.GetNumber()).Cast <object>().ToList());

                case TypeId.VariantArray:
                    return(val.GetArray().Select(ConvertVariant).Cast <object>().ToList());

                case TypeId.Int64Array:
                    return(val.GetArray().Select(x => (Int64)x.GetNumber()).Cast <object>().ToList());

                case TypeId.Uint8Array:
                    return(val.GetArray().Select(x => (byte)x.GetNumber()).Cast <object>().ToList());

                case TypeId.SignatureArray:
                    return(val.GetArray().Select(x => x.GetString()).Cast <object>().ToList());

                case TypeId.ObjectPathArray:
                    return(val.GetArray().Select(x => x.GetString()).Cast <object>().ToList());

                case TypeId.StringArray:
                    return(val.GetArray().Select(x => x.GetString()).Cast <object>().ToList());

                case TypeId.StructArray:
                    return(val.GetArray().Select(x => ConvertStruct(type, x)).Cast <object>().ToList());
                }
            }
            catch (Exception) { };

            throw Logger.LogException("AllJoyn cast", new InvalidCastException());
        }
Beispiel #24
0
        private bool JsonComparesEqual(IJsonValue expected, IJsonValue actual)
        {
            if (expected.ValueType != actual.ValueType)
            {
                return(false);
            }
            switch (expected.ValueType)
            {
            case JsonValueType.String:
                if (expected.GetString() == actual.GetString())
                {
                    return(true);
                }
                else
                {
                    Debug.WriteLine($"Expected {expected.GetString()} got {actual.GetString()}"); return(false);
                }

            case JsonValueType.Number:
                return(expected.GetNumber() == actual.GetNumber());

            case JsonValueType.Boolean:
                return(expected.GetBoolean() == actual.GetBoolean());

            case JsonValueType.Null:
                return(true);

            case JsonValueType.Array:
            {
                var ea = expected.GetArray();
                var aa = actual.GetArray();
                if (ea.Count != aa.Count)
                {
                    return(false);
                }
                for (uint i = 0; i < ea.Count; i++)
                {
                    if (!JsonComparesEqual(ea[(int)i], aa[(int)i]))
                    {
                        return(false);
                    }
                }
                return(true);
            }

            case JsonValueType.Object:
            {
                var eo = expected.GetObject();
                var ao = actual.GetObject();
                if (eo.Keys.Count != ao.Keys.Count)
                {
                    return(false);
                }
                foreach (var key in eo.Keys)
                {
                    if (!JsonComparesEqual(eo.GetNamedValue(key), ao.GetNamedValue(key)))
                    {
                        return(false);
                    }
                }
                return(true);
            }

            default:
                throw new ArgumentException();
            }
        }
 public static bool?AsBool(this IJsonValue value)
 {
     return((value != null && value.ValueType == JsonValueType.Boolean) ?
            (bool?)value.GetBoolean() :
            null);
 }
Beispiel #26
0
        public static object ConvertObject(Type type, string data)
        {
            if (string.IsNullOrEmpty(data) ||
                (!data.StartsWith("{") && !data.EndsWith("}")) ||
                data.ToLower().Equals("null") ||
                data.ToLower().Equals("[]") ||
                data.ToLower().Equals("{}"))
            {
                return(null);
            }

            JsonObject jsonObject = JsonObject.Parse(data);

            //if(!JsonObject.TryParse(data, out jsonObject))
            //{
            //    return null;
            //}

            var result = Activator.CreateInstance(type);

            var properties = type.GetProperties();
            Dictionary <int, bool> checkedIndexs = new Dictionary <int, bool>();
            int count = properties.Length;

            foreach (var json in jsonObject)
            {
                // Debug.WriteLine($"{json.Key} : {json.Value.ToString()}");

                if (count == 0)
                {
                    break;
                }
                for (int i = 0; i < count; i++)
                {
                    // Check Impelement checked

                    bool isChecked = false;
                    if (checkedIndexs.ContainsKey(i))
                    {
                        isChecked = checkedIndexs[i];
                    }
                    if (isChecked)
                    {
                        continue;
                    }

                    // Check Property Sign
                    var property = properties.GetValue(i) as PropertyInfo;
                    var sign     = property.GetCustomAttribute <SignAttribute>();
                    if (sign == null)
                    {
                        continue;
                    }

                    if (json.Key.Equals(sign.Name))
                    {
                        if (property != null)
                        {
                            var        propertyType = property.PropertyType;
                            var        typeInfo     = propertyType.GetTypeInfo();
                            IJsonValue jsonValue    = json.Value;

                            //Debug.Write(jsonValue.ValueType);

                            if (typeInfo.IsValueType)
                            {
                                if (propertyType.IsTypeOf <int>())
                                {
                                    if (jsonValue.ValueType == JsonValueType.Null)
                                    {
                                        property.SetValue(result,
                                                          Convert.ChangeType(0, propertyType));
                                    }
                                    else if (jsonValue.ValueType == JsonValueType.Number)
                                    {
                                        property.SetValue(result,
                                                          Convert.ChangeType(jsonValue.GetNumber(), propertyType));
                                    }
                                    else
                                    {
                                        int number;
                                        property.SetValue(result,
                                                          int.TryParse(jsonValue.GetString(), out number)
                                                ? Convert.ChangeType(number, propertyType)
                                                : Convert.ChangeType(0, propertyType));
                                    }
                                }
                                else if (propertyType.IsTypeOf <bool>())
                                {
                                    if (jsonValue.ValueType == JsonValueType.Null)
                                    {
                                        property.SetValue(result,
                                                          Convert.ChangeType(false, propertyType));
                                    }
                                    else if (jsonValue.ValueType == JsonValueType.Boolean)
                                    {
                                        property.SetValue(result, Convert.ChangeType(jsonValue.GetBoolean(), propertyType));
                                    }
                                    else
                                    {
                                        bool boolean;
                                        property.SetValue(result,
                                                          bool.TryParse(jsonValue.GetString(), out boolean)
                                                ? Convert.ChangeType(boolean, propertyType)
                                                : Convert.ChangeType(0, propertyType));
                                    }
                                }
                                else if (propertyType.IsTypeOf <long>())
                                {
                                    if (jsonValue.ValueType == JsonValueType.Null)
                                    {
                                        property.SetValue(result,
                                                          Convert.ChangeType(0, propertyType));
                                    }
                                    else if (jsonValue.ValueType == JsonValueType.String || jsonValue.ValueType == JsonValueType.Object)
                                    {
                                        long number;
                                        property.SetValue(result,
                                                          long.TryParse(jsonValue.GetString(), out number)
                                                ? Convert.ChangeType(number, propertyType)
                                                : Convert.ChangeType(0, propertyType));
                                    }
                                    else
                                    {
                                        property.SetValue(result, Convert.ChangeType(jsonValue.GetNumber(), propertyType));
                                    }
                                }
                                else if (propertyType.IsTypeOf <double>())
                                {
                                    if (jsonValue.ValueType == JsonValueType.Null)
                                    {
                                        property.SetValue(result,
                                                          Convert.ChangeType(0, propertyType));
                                    }
                                    else if (jsonValue.ValueType == JsonValueType.String || jsonValue.ValueType == JsonValueType.Object)
                                    {
                                        double number;
                                        property.SetValue(result,
                                                          double.TryParse(jsonValue.GetString(), out number)
                                                ? Convert.ChangeType(number, propertyType)
                                                : Convert.ChangeType(0, propertyType));
                                    }
                                    else
                                    {
                                        property.SetValue(result, Convert.ChangeType(jsonValue.GetNumber(), propertyType));
                                    }
                                }
                                else if (propertyType.IsTypeOf <byte>())
                                {
                                    if (jsonValue.ValueType == JsonValueType.Null)
                                    {
                                        property.SetValue(result,
                                                          Convert.ChangeType(0, propertyType));
                                    }
                                    else if (jsonValue.ValueType == JsonValueType.String || jsonValue.ValueType == JsonValueType.Object)
                                    {
                                        byte number;
                                        property.SetValue(result,
                                                          byte.TryParse(jsonValue.GetString(), out number)
                                                ? Convert.ChangeType(number, propertyType)
                                                : Convert.ChangeType(0, propertyType));
                                    }
                                }
                            }
                            else if (propertyType.IsTypeOf <string>() && jsonValue.ValueType == JsonValueType.String)
                            {
                                if (jsonValue.ValueType == JsonValueType.Null)
                                {
                                    property.SetValue(result,
                                                      Convert.ChangeType(String.Empty, propertyType));
                                }
                                else if (jsonValue.ValueType == JsonValueType.String)
                                {
                                    property.SetValue(result, Convert.ChangeType(jsonValue.GetString(), propertyType));
                                }
                                else if (jsonValue.ValueType == JsonValueType.Number)
                                {
                                    property.SetValue(result, Convert.ChangeType(jsonValue.GetNumber().ToString(), propertyType));
                                }
                                else if (jsonValue.ValueType == JsonValueType.Boolean)
                                {
                                    property.SetValue(result, Convert.ChangeType(jsonValue.GetBoolean().ToString(), propertyType));
                                }
                                else if (jsonValue.ValueType == JsonValueType.Object)
                                {
                                    property.SetValue(result, Convert.ChangeType(jsonValue.GetObject().ToString(), propertyType));
                                }
                            }
                            else if (typeInfo.IsClass)
                            {
                                // generic
                                if (typeInfo.IsGenericType)
                                {
                                    var types = typeInfo.ImplementedInterfaces;

                                    var collection = types.FirstOrDefault(p => p.FullName.Contains("Generic") || p.FullName.Contains("IList") || p.FullName.Contains("Collection") || p.FullName.Contains("IEnumerable"));

                                    if (collection != null) // Generic Collection
                                    {
                                        var itemType = propertyType.GetGenericArguments().FirstOrDefault();

                                        string arrayData = json.Value != null?json.Value.ToString() : string.Empty;

                                        if (!string.IsNullOrEmpty(arrayData))
                                        {
                                            var items = (IList)Activator.CreateInstance(propertyType);

                                            var jsonArray = JsonArray.Parse(arrayData);
                                            //     List<object> data = new List<Object>();
                                            foreach (var _jsonValue in jsonArray)
                                            {
                                                var item = ConvertObject(itemType, _jsonValue.ToString());
                                                items.Add(item);
                                                //      data.Add(item);
                                            }
                                            property.SetValue(result, Convert.ChangeType(items, propertyType));
                                        }
                                    }
                                    else // Generic class
                                    {
                                        property.SetValue(result, Convert.ChangeType(ConvertObject(propertyType, json.Value.ToString()), propertyType));
                                    }
                                }
                                else // reference class
                                {
                                    //property.SetValue(result, Convert.ChangeType(jsonValue.GetString(), propertyType));
                                    property.SetValue(result, Convert.ChangeType(ConvertObject(propertyType, json.Value.ToString()), propertyType));
                                }
                            }
                        }

                        checkedIndexs[i] = true;
                        break;
                    }
                }
            }

            return(result);
        }
Beispiel #27
0
        public static bool CompareJson(IJsonValue expected, IJsonValue actual, List <string> errors)
        {
            if (expected == null)
            {
                return(actual == null);
            }

            if (actual == null)
            {
                return(false);
            }

            if (expected.ValueType != actual.ValueType)
            {
                errors.Add(string.Format("Expected value type {0} != actual {1}", expected.ValueType, actual.ValueType));
                return(false);
            }

            switch (expected.ValueType)
            {
            case JsonValueType.Boolean:
                return(expected.GetBoolean() == actual.GetBoolean());

            case JsonValueType.Null:
                return(true);

            case JsonValueType.String:
                return(expected.GetString() == actual.GetString());

            case JsonValueType.Number:
                double expectedNumber    = expected.GetNumber();
                double actualNumber      = actual.GetNumber();
                double delta             = 1 - expectedNumber / actualNumber;
                double acceptableEpsilon = 0.000001;
                if (Math.Abs(delta) > acceptableEpsilon)
                {
                    errors.Add(string.Format("Numbers differ more than the allowed difference: {0} - {1}",
                                             expected.Stringify(), actual.Stringify()));
                    return(false);
                }
                else
                {
                    return(true);
                }

            case JsonValueType.Array:
                JsonArray expectedArray = expected.GetArray();
                JsonArray actualArray   = actual.GetArray();
                if (expectedArray.Count != actualArray.Count)
                {
                    errors.Add(string.Format("Size of arrays are different: expected {0} != actual {1}", expectedArray.Count, actualArray.Count));
                    return(false);
                }

                for (int i = 0; i < expectedArray.Count; i++)
                {
                    if (!CompareJson(expectedArray[i], actualArray[i], errors))
                    {
                        errors.Add("Difference in array item at index " + i);
                        return(false);
                    }
                }

                return(true);

            case JsonValueType.Object:
                JsonObject expectedObject = expected.GetObject();
                JsonObject actualObject   = actual.GetObject();
                foreach (var key in expectedObject.Keys)
                {
                    if (key == "id")
                    {
                        continue;                  // set by server, ignored at comparison
                    }
                    if (!actualObject.ContainsKey(key))
                    {
                        errors.Add(string.Format("Expected object contains a pair with key {0}, actual does not.", key));
                        return(false);
                    }

                    if (!CompareJson(expectedObject[key], actualObject[key], errors))
                    {
                        errors.Add("Difference in object member with key " + key);
                        return(false);
                    }
                }

                return(true);

            default:
                throw new ArgumentException("Don't know how to compare IJsonValue of type " + expected.ValueType);
            }
        }