コード例 #1
0
ファイル: JSON.cs プロジェクト: luojinfang/IoTGateway
        private static void Encode(object Object, int?Indent, StringBuilder Json)
        {
            if (Object is null)
            {
                Json.Append("null");
            }
            else
            {
                Type     T  = Object.GetType();
                TypeInfo TI = T.GetTypeInfo();

                if (TI.IsValueType)
                {
                    if (Object is bool b)
                    {
                        Json.Append(CommonTypes.Encode(b));
                    }
                    else if (Object is char ch)
                    {
                        Json.Append('"');
                        Json.Append(Encode(new string(ch, 1)));
                        Json.Append('"');
                    }
                    else if (Object is double dbl)
                    {
                        Json.Append(CommonTypes.Encode(dbl));
                    }
                    else if (Object is float fl)
                    {
                        Json.Append(CommonTypes.Encode(fl));
                    }
                    else if (Object is decimal dec)
                    {
                        Json.Append(CommonTypes.Encode(dec));
                    }
                    else if (TI.IsEnum)
                    {
                        Json.Append('"');
                        Json.Append(Encode(Object.ToString()));
                        Json.Append('"');
                    }
                    else if (Object is DateTime TP)
                    {
                        Json.Append(((int)((TP.ToUniversalTime() - UnixEpoch).TotalSeconds)).ToString());
                    }
                    else
                    {
                        Json.Append(Object.ToString());
                    }
                }
                else if (Object is string s)
                {
                    Json.Append('"');
                    Json.Append(Encode(s));
                    Json.Append('"');
                }
                else if (Object is IEnumerable <KeyValuePair <string, object> > Obj)
                {
                    Encode(Obj, Indent, Json, null);
                }
                else if (Object is IEnumerable E)
                {
                    IEnumerator e     = E.GetEnumerator();
                    bool        First = true;

                    Json.Append('[');

                    if (Indent.HasValue)
                    {
                        Indent = Indent + 1;
                    }

                    while (e.MoveNext())
                    {
                        if (First)
                        {
                            First = false;
                        }
                        else
                        {
                            Json.Append(',');
                        }

                        if (Indent.HasValue)
                        {
                            Json.AppendLine();
                            Json.Append(new string('\t', Indent.Value));
                        }

                        Encode(e.Current, Indent, Json);
                    }

                    if (!First && Indent.HasValue)
                    {
                        Json.AppendLine();
                        Indent = Indent - 1;
                        Json.Append(new string('\t', Indent.Value));
                    }

                    Json.Append(']');
                }
                else
                {
                    throw new ArgumentException("Unsupported type: " + T.FullName, nameof(Object));
                }
            }
        }
コード例 #2
0
ファイル: JwtFactory.cs プロジェクト: markchipman/IoTGateway
        /// <summary>
        /// Creates a new JWT token.
        /// </summary>
        /// <param name="Claims">Claims to include in token.
        ///
        /// For a list of public claim names, see:
        /// https://www.iana.org/assignments/jwt/jwt.xhtml</param>
        /// <returns>JWT token.</returns>
        public string Create(params KeyValuePair <string, object>[] Claims)
        {
            StringBuilder Json  = new StringBuilder("{");
            bool          First = true;

            foreach (KeyValuePair <string, object> Claim in Claims)
            {
                if (First)
                {
                    First = false;
                }
                else
                {
                    Json.Append(',');
                }

                Json.Append('"');
                Json.Append(JSON.Encode(Claim.Key));
                Json.Append("\":");

                if (Claim.Value == null)
                {
                    Json.Append("null");
                }
                else if (Claim.Value is string s)
                {
                    Json.Append('"');
                    Json.Append(JSON.Encode(s));
                    Json.Append('"');
                }
                else if (Claim.Value is bool b)
                {
                    if (b)
                    {
                        Json.Append("true");
                    }
                    else
                    {
                        Json.Append("false");
                    }
                }
                else if (Claim.Value is DateTime TP)
                {
                    Json.Append(((int)((TP.ToUniversalTime() - JwtToken.epoch).TotalSeconds)).ToString());
                }
                else if (Claim.Value is int i)
                {
                    Json.Append(i.ToString());
                }
                else if (Claim.Value is long l)
                {
                    Json.Append(l.ToString());
                }
                else if (Claim.Value is short sh)
                {
                    Json.Append(sh.ToString());
                }
                else if (Claim.Value is byte bt)
                {
                    Json.Append(bt.ToString());
                }
                else
                {
                    Json.Append('"');
                    Json.Append(JSON.Encode(Claim.Value.ToString()));
                    Json.Append('"');
                }
            }

            Json.Append('}');

            string PayloadStr = Json.ToString();

            byte[] PayloadBin = Encoding.UTF8.GetBytes(PayloadStr);
            string Payload    = JwtToken.Base64UrlEncode(PayloadBin);

            byte[] Signature;
            string Token = this.header + "." + Payload;

            lock (this.hmacSHA256)
            {
                Signature = this.hmacSHA256.ComputeHash(Encoding.ASCII.GetBytes(Token));
            }

            Token += "." + JwtToken.Base64UrlEncode(Signature);

            return(Token);
        }
コード例 #3
0
        private static void Encode(object Object, int?Indent, StringBuilder Json)
        {
            if (Object is null)
            {
                Json.Append("null");
            }
            else
            {
                Type     T  = Object.GetType();
                TypeInfo TI = T.GetTypeInfo();

                if (TI.IsValueType)
                {
                    if (Object is bool b)
                    {
                        Json.Append(CommonTypes.Encode(b));
                    }
                    else if (Object is char ch)
                    {
                        Json.Append('"');
                        Json.Append(Encode(new string(ch, 1)));
                        Json.Append('"');
                    }
                    else if (Object is double dbl)
                    {
                        Json.Append(CommonTypes.Encode(dbl));
                    }
                    else if (Object is float fl)
                    {
                        Json.Append(CommonTypes.Encode(fl));
                    }
                    else if (Object is decimal dec)
                    {
                        Json.Append(CommonTypes.Encode(dec));
                    }
                    else if (TI.IsEnum)
                    {
                        Json.Append('"');
                        Json.Append(Encode(Object.ToString()));
                        Json.Append('"');
                    }
                    else if (Object is DateTime TP)
                    {
                        Json.Append(((int)((TP.ToUniversalTime() - UnixEpoch).TotalSeconds)).ToString());
                    }
                    else
                    {
                        Json.Append(Object.ToString());
                    }
                }
                else if (Object is string s)
                {
                    Json.Append('"');
                    Json.Append(Encode(s));
                    Json.Append('"');
                }
                else if (Object is IEnumerable <KeyValuePair <string, object> > Obj)
                {
                    Encode(Obj, Indent, Json, null);
                }
                else if (Object is IEnumerable <KeyValuePair <string, IElement> > Obj2)
                {
                    Encode(Obj2, Indent, Json);
                }
                else if (Object is IEnumerable E)
                {
                    IEnumerator e     = E.GetEnumerator();
                    bool        First = true;

                    Json.Append('[');

                    if (Indent.HasValue)
                    {
                        Indent++;
                    }

                    while (e.MoveNext())
                    {
                        if (First)
                        {
                            First = false;
                        }
                        else
                        {
                            Json.Append(',');
                        }

                        if (Indent.HasValue)
                        {
                            Json.AppendLine();
                            Json.Append(new string('\t', Indent.Value));
                        }

                        Encode(e.Current, Indent, Json);
                    }

                    if (!First && Indent.HasValue)
                    {
                        Json.AppendLine();
                        Indent--;
                        Json.Append(new string('\t', Indent.Value));
                    }

                    Json.Append(']');
                }
                else if (Object is ObjectMatrix M && !(M.ColumnNames is null))
                {
                    bool First = true;

                    Json.Append('[');

                    if (Indent.HasValue)
                    {
                        Indent++;
                    }

                    foreach (IElement Element in M.VectorElements)
                    {
                        if (First)
                        {
                            First = false;
                            Encode(M.ColumnNames, Indent, Json);
                        }

                        Json.Append(',');

                        if (Indent.HasValue)
                        {
                            Json.AppendLine();
                            Json.Append(new string('\t', Indent.Value));
                        }

                        Encode(Element.AssociatedObjectValue, Indent, Json);
                    }

                    if (!First && Indent.HasValue)
                    {
                        Json.AppendLine();
                        Indent--;
                        Json.Append(new string('\t', Indent.Value));
                    }

                    Json.Append(']');
                }