コード例 #1
0
ファイル: JsonParser.cs プロジェクト: scucmgame/knight
        /// <summary>
        /// 从对象到JsonNode
        /// </summary>
        public static JsonNode ToJsonNode(object rObject)
        {
            Type rType = rObject.GetType();

            JsonNode rRootNode = null;

            //如果是List
            if (rType.IsGenericType && typeof(IList).IsAssignableFrom(rType.GetGenericTypeDefinition()))
            {
                rRootNode = new JsonArray();
                IList rListObj = (IList)rObject;
                foreach (var rItem in rListObj)
                {
                    JsonNode rNode = ToJsonNode(rItem);
                    rRootNode.Add(rNode);
                }
            }
            else if (rType.IsArray) //如果是Array
            {
                rRootNode = new JsonArray();
                Array rArrayObj = (Array)rObject;
                foreach (var rItem in rArrayObj)
                {
                    JsonNode rNode = ToJsonNode(rItem);
                    rRootNode.Add(rNode);
                }
            }
            else if (rType.IsGenericType && typeof(IDictionary).IsAssignableFrom(rType.GetGenericTypeDefinition()))
            {
                //如果是Dictionary
                rRootNode = new JsonClass();
                IDictionary rDictObj = (IDictionary)rObject;
                foreach (var rKey in rDictObj.Keys)
                {
                    JsonNode rValueNode = ToJsonNode(rDictObj[rKey]);
                    rRootNode.Add(rKey.ToString(), rValueNode);
                }
            }
            else if (rType.IsGenericType && typeof(IDict).IsAssignableFrom(rType.GetGenericTypeDefinition()))
            {
                rRootNode = new JsonClass();
                IDict rDictObj = (IDict)rObject;
                foreach (var rItem in rDictObj.OriginCollection)
                {
                    JsonNode rValueNode = ToJsonNode(rItem.Value);
                    rRootNode.Add(rItem.Key.ToString(), rValueNode);
                }
            }
            else if (rType.IsClass) //如果是Class,获取Class所有的public的字段和属性
            {
                if (rType == typeof(string))
                {
                    rRootNode = new JsonData((string)rObject);
                }
                else
                {
                    rRootNode = new JsonClass();
                    // 所有公共的属性
                    PropertyInfo[] rPropInfos = rType.GetProperties(ReflectionAssist.flags_public);
                    for (int i = 0; i < rPropInfos.Length; i++)
                    {
                        if (rPropInfos[i].IsDefined(typeof(JsonIgnoreAttribute), false))
                        {
                            continue;
                        }

                        object   rValueObj  = rPropInfos[i].GetValue(rObject, null);
                        JsonNode rValueNode = ToJsonNode(rValueObj);
                        rRootNode.Add(rPropInfos[i].Name, rValueNode);
                    }
                    // 所有公共的字段
                    FieldInfo[] rFieldInfos = rType.GetFields(ReflectionAssist.flags_public);
                    for (int i = 0; i < rFieldInfos.Length; i++)
                    {
                        if (rFieldInfos[i].IsDefined(typeof(JsonIgnoreAttribute), false))
                        {
                            continue;
                        }

                        object   rValueObj  = rFieldInfos[i].GetValue(rObject);
                        JsonNode rValueNode = ToJsonNode(rValueObj);
                        rRootNode.Add(rFieldInfos[i].Name, rValueNode);
                    }

                    // 所有预定义的序列化属性的private的字段
                    rPropInfos = rType.GetProperties(ReflectionAssist.flags_nonpublic);
                    for (int i = 0; i < rPropInfos.Length; i++)
                    {
                        if (!rPropInfos[i].IsDefined(typeof(JsonEnableAttribute), false))
                        {
                            continue;
                        }

                        object   rValueObj  = rPropInfos[i].GetValue(rObject, null);
                        JsonNode rValueNode = ToJsonNode(rValueObj);
                        rRootNode.Add(rPropInfos[i].Name, rValueNode);
                    }
                    rFieldInfos = rType.GetFields(ReflectionAssist.flags_nonpublic);
                    for (int i = 0; i < rFieldInfos.Length; i++)
                    {
                        if (!rFieldInfos[i].IsDefined(typeof(JsonEnableAttribute), false))
                        {
                            continue;
                        }

                        object   rValueObj  = rFieldInfos[i].GetValue(rObject);
                        JsonNode rValueNode = ToJsonNode(rValueObj);
                        rRootNode.Add(rFieldInfos[i].Name, rValueNode);
                    }
                }
            }
            else if (rType.IsPrimitive) //如果是实例
            {
                if (rType == typeof(int))
                {
                    rRootNode = new JsonData((int)rObject);
                }
                else if (rType == typeof(uint))
                {
                    rRootNode = new JsonData((uint)rObject);
                }
                else if (rType == typeof(long))
                {
                    rRootNode = new JsonData((long)rObject);
                }
                else if (rType == typeof(ulong))
                {
                    rRootNode = new JsonData((ulong)rObject);
                }
                else if (rType == typeof(float))
                {
                    rRootNode = new JsonData((float)rObject);
                }
                else if (rType == typeof(double))
                {
                    rRootNode = new JsonData((double)rObject);
                }
                else if (rType == typeof(bool))
                {
                    rRootNode = new JsonData((bool)rObject);
                }
                else if (rType == typeof(string))
                {
                    rRootNode = new JsonData((string)rObject);
                }
                else if (rType == typeof(byte))
                {
                    rRootNode = new JsonData((byte)rObject);
                }
                else if (rType == typeof(short))
                {
                    rRootNode = new JsonData((short)rObject);
                }
                else if (rType == typeof(ushort))
                {
                    rRootNode = new JsonData((ushort)rObject);
                }
                else
                {
                    Debug.LogError(string.Format("Type = {0}, 不支持序列化的变量类型!", rObject.GetType()));
                }
            }
            else if (rType.IsEnum)
            {
                rRootNode = new JsonData((int)rObject);
            }
            return(rRootNode);
        }
コード例 #2
0
ファイル: JsonParser.cs プロジェクト: scucmgame/knight
        /// <summary>
        /// 解析Json
        /// </summary>
        public JsonNode Parser()
        {
            this.isValid = true;
            int end = 0;
            int i   = 0;

            JsonSymbolItem rCurSymbol  = null;
            JsonSymbolItem rLastSymbol = null;

            Stack <JsonSymbolItem> rNodeStack = new Stack <JsonSymbolItem>();

            while (i < this.originData.Length)
            {
                //跳过那些无用的字符 ' ', '\t', '\r' '\n' 注释
                if (!string.IsNullOrEmpty(LexicalAnalysis.isSpecialSymbol(originData, i, ref end)) || !string.IsNullOrEmpty(LexicalAnalysis.isComment(originData, i, ref end)))
                {
                    i = end;
                    continue;
                }

                rCurSymbol = buildSymbolItem(rLastSymbol, i, ref end);
                if (rCurSymbol != null)
                {
                    switch (rCurSymbol.type)
                    {
                    case JsonSymbolType.Unknown:
                        Debug.LogError("Json format error.");
                        break;

                    case JsonSymbolType.ObjStart:
                        rCurSymbol.node = new JsonClass();
                        rNodeStack.Push(rCurSymbol);
                        break;

                    case JsonSymbolType.ObjEnd:
                        JsonNode rObject0 = new JsonClass();
                        while (rNodeStack.Count != 0 && rNodeStack.Peek().type != JsonSymbolType.ObjStart)
                        {
                            var rTopSymbol = rNodeStack.Pop();
                            if (rTopSymbol.type == JsonSymbolType.ObjSplit)
                            {
                                continue;
                            }
                            else if (rTopSymbol.type == JsonSymbolType.Element)
                            {
                                rObject0.AddHead(rTopSymbol.node.Key, rTopSymbol.node[rTopSymbol.node.Key]);
                            }
                        }
                        rNodeStack.Pop();
                        var rSymbol0 = new JsonSymbolItem();
                        rSymbol0.type  = JsonSymbolType.Value;
                        rSymbol0.node  = rObject0;
                        rSymbol0.value = rObject0.ToString();
                        Generate_ElementSymbol(ref rNodeStack, rSymbol0);
                        break;

                    case JsonSymbolType.ArrayStart:
                        rCurSymbol.node = new JsonArray();
                        rNodeStack.Push(rCurSymbol);
                        break;

                    case JsonSymbolType.ArrayEnd:
                        JsonNode rArray = new JsonArray();
                        while (rNodeStack.Peek().type != JsonSymbolType.ArrayStart)
                        {
                            var rTopSymbol = rNodeStack.Pop();
                            if (rTopSymbol.type == JsonSymbolType.ObjSplit)
                            {
                                continue;
                            }
                            else if (rTopSymbol.type == JsonSymbolType.Element)
                            {
                                rArray.AddHead(rTopSymbol.node);
                            }
                        }
                        rNodeStack.Pop();
                        var rSymbol = new JsonSymbolItem();
                        rSymbol.type  = JsonSymbolType.Value;
                        rSymbol.node  = rArray;
                        rSymbol.value = rArray.ToString();
                        Generate_ElementSymbol(ref rNodeStack, rSymbol);
                        break;

                    case JsonSymbolType.ObjSplit:
                        rNodeStack.Push(rCurSymbol);
                        break;

                    case JsonSymbolType.ElementSplit:
                        rNodeStack.Push(rCurSymbol);
                        break;

                    case JsonSymbolType.Key:
                        rNodeStack.Push(rCurSymbol);
                        break;

                    case JsonSymbolType.Value:
                        Generate_ElementSymbol(ref rNodeStack, rCurSymbol);
                        break;

                    default:
                        break;
                    }
                    i           = end;
                    rLastSymbol = rCurSymbol;
                    continue;
                }
                i++;
            }
            return(rNodeStack.Peek().node);
        }