示例#1
0
        /// <summary>
        /// Processes the "wrap" Json protocol with ChangeResult such as: '{OK: true, change: "Inserted", affected: 3, message: "...", data: {...}}'
        /// Throws averment exceptions if OK!=true, no 'data' or 'change' keys are returned
        /// </summary>
        public static ChangeResult UnwrapChangeResult(this JsonDataMap data)
        {
            data.NonNull(nameof(data)).ExpectOK();

            Aver.IsTrue(data.ContainsKey("change"), "no ['change'] key");
            Aver.IsTrue(data.ContainsKey("data"), "no ['data'] key");

            return(new ChangeResult(data));
        }
示例#2
0
文件: Doc.cs 项目: wangchengqun/azos
        /// <summary>
        /// Returns this object converted to JsonDataMap. Only shallow conversion is done, that is:
        /// any complex values are added as-is.
        /// This method is the backbone of DOC to JSON serialization
        /// </summary>
        public virtual JsonDataMap ToJsonDataMap(JsonWritingOptions options = null)
        {
            var map = new JsonDataMap();

            foreach (var fd in Schema)
            {
                string name;

                var val = FilterJsonSerializerField(fd, options, out name);
                if (name.IsNullOrWhiteSpace())
                {
                    continue;                   //field was excluded for Json serialization
                }
                AddJsonSerializerField(fd, options, map, name, val);
            }

            if (this is IAmorphousData amorph)
            {
                if (amorph.AmorphousDataEnabled)
                {
                    foreach (var kv in amorph.AmorphousData)
                    {
                        var key = kv.Key;
                        while (map.ContainsKey(key))
                        {
                            key += "_";
                        }
                        AddJsonSerializerField(null, options, map, key, kv.Value);
                    }
                }
            }

            return(map);
        }
示例#3
0
        /// <summary>
        /// Returns true if JsonDataMap map is not null and it has a named key and its value matches the specified pattern using * and ? wild cards a la DOS
        /// </summary>
        public static bool MapValueMatches(this JsonDataMap map, string key, string pattern, bool senseCase = false)
        {
            if (map == null)
            {
                return(false);
            }
            if (key.IsNullOrWhiteSpace())
            {
                return(false);
            }

            if (!map.ContainsKey(key))
            {
                return(false);
            }

            var got = map[key].AsString(null);

            if (got == null && pattern == null)
            {
                return(true);
            }

            return(got.MatchPattern(pattern, senseCase: senseCase));
        }
示例#4
0
        /// <summary>
        /// Returns true if JsonDataMap map is not null and it has a named key and its value contains the specified substring doing case insensitive
        /// comparison by default. Used in unit tests doing partial data matches
        /// </summary>
        public static bool MapValueContains(this JsonDataMap map, string key, string substring, bool senseCase = false)
        {
            if (map == null)
            {
                return(false);
            }
            if (key.IsNullOrWhiteSpace())
            {
                return(false);
            }

            if (!map.ContainsKey(key))
            {
                return(false);
            }

            var got = map[key].AsString(null);

            if (got == null && substring == null)
            {
                return(true);
            }

            return(got.IndexOf(substring, senseCase ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase) >= 0);
        }
示例#5
0
        /// <summary>
        /// Processes the "wrap" Json protocol with JsonDataMap such as: '{OK: true, data: object}'
        /// Throws averment exceptions if OK!=true, no 'data' key was returned.
        /// The property 'data' may be NULL
        /// </summary>
        public static object UnwrapPayloadObject(this JsonDataMap data)
        {
            data.NonNull(nameof(data)).ExpectOK();

            Aver.IsTrue(data.ContainsKey("data"), "no ['data'] key");
            var result = data["data"];

            return(result);
        }
示例#6
0
        /// <summary>
        /// Processes the "wrap" Json protocol with JsonDataArray such as: '{OK: true, data: [...array...]}'
        /// Throws averment exceptions if OK!=true, no 'data' key was returned or data is not a json array
        /// </summary>
        public static JsonDataArray UnwrapPayloadArray(this JsonDataMap data)
        {
            data.NonNull(nameof(data)).ExpectOK();

            Aver.IsTrue(data.ContainsKey("data"), "no ['data'] key");
            var result = data["data"] as JsonDataArray;

            Aver.IsNotNull(result, "['data'] is not array");

            return(result);
        }
示例#7
0
        /// <summary>
        /// Processes the "wrap" Json protocol such as: '{OK: true, data: {...}}'
        /// Throws averment exceptions if OK!=true, no 'data' key was returned or data is not an existing map
        /// </summary>
        public static JsonDataMap UnwrapPayloadMap(this JsonDataMap data)
        {
            data.NonNull(nameof(data));

            Aver.IsTrue(data["OK"].AsBool(), "OK != true");
            Aver.IsTrue(data.ContainsKey("data"), "no ['data'] key");
            var result = data["data"] as JsonDataMap;

            Aver.IsNotNull(result, "['data'] is not map");

            return(result);
        }
示例#8
0
        private JsonDataMap doObject()
        {
            fetchPrimary(); // skip {

            var obj = new JsonDataMap(this.m_CaseSensitiveMaps);

            if (token.Type != JsonTokenType.tBraceClose)//empty object  {}
            {
                while (true)
                {
                    if (token.Type != JsonTokenType.tIdentifier && token.Type != JsonTokenType.tStringLiteral)
                    {
                        errorAndAbort(JsonMsgCode.eObjectKeyExpected);
                    }

                    var key = token.Text;

                    if (obj.ContainsKey(key))
                    {
                        errorAndAbort(JsonMsgCode.eDuplicateObjectKey);
                    }

                    fetchPrimary();
                    if (token.Type != JsonTokenType.tColon)
                    {
                        errorAndAbort(JsonMsgCode.eColonOperatorExpected);
                    }

                    fetchPrimary();

                    var value = doAny();

                    obj[key] = value;

                    fetchPrimary();
                    if (token.Type != JsonTokenType.tComma)
                    {
                        break;
                    }
                    fetchPrimary();
                }

                if (token.Type != JsonTokenType.tBraceClose)
                {
                    errorAndAbort(JsonMsgCode.eUnterminatedObject);
                }
            }
            return(obj);
        }