zoukankan      html  css  js  c++  java
  • RJson

    这是一篇关于在后台使用C#语言将Json字符串转化为对象集合类的介绍,适用于处理后台接收Json字符串,将Json字符串转Xml或者其他格式的场合。

    主要的思想如下:
    JsonProxy
    json集合使用List<List<JsonClass>>表示。
    json对象使用List<JsonClass>表示。
    其中JsonClass表示Json字符串一个一个的Key-Value。
    ==》JsonClass(key,value,type,fullstring......)

    //Create By YZR     
    public
    class JsonClass { #region 成员 //===>"name":"YZR" private string fullString; public string FullString { get { return fullString; } set { fullString = value; } } private string key; public string Key { get { return key; } set { key = value; } } private JsonClass[] jcs; private List<object> valueContainer;//json集合形式,存放的可能是json对象,也可能是object类型值 public List<object> ValueContainer { get { return valueContainer; } set { valueContainer = value; } } private List<List<JsonClass>> jsonContainer; public List<List<JsonClass>> JsonContainer { get { return jsonContainer; } set { jsonContainer = value; } } public JsonClass[] Jcs { get { return jcs; } set { jcs = value; } } private object value; public object Value { get { return this.value; } set { this.value = value; } } private SubJsonType valueType; public SubJsonType ValueType { get { return valueType; } set { valueType = value; } } #endregion #region 构造函数 public JsonClass() { } public JsonClass(string key, object value) { this.key = key; this.value = value; this.fullString = key + ":" + value; } public JsonClass(string key, List<object> valueContainer) { this.key = key; this.valueContainer = valueContainer; }//集合 public JsonClass(string key, JsonClass[] jcs) { this.key = key; this.jcs = jcs; }//对象 public JsonClass(string str) { this.fullString = str; init(); } #endregion private void init() { JosnProxy jp = new JosnProxy(fullString); jp.init(); if (jp.JsonType == JsonType.Object)//json对象 { List<JsonClass> list = jp.JsonList; JsonClass temp = new JsonClass(); JsonClass[] jsc = new JsonClass[list.Count]; for (int i = 0; i < list.Count; i++) { jsc[i] = list[i]; } this.Jcs = jsc; } else if (jp.JsonType == JsonType.List)//json集合 { SubJsonType subType = JsonParse.JudgeJsonType(fullString.Substring(1, fullString.Length - 2)); //SubJsonType subType = JsonParse.JudgeJsonType(fullString); switch (subType) { case SubJsonType.Object: this.valueContainer = jp.valueContainer; break; case SubJsonType.JsonClass: this.jsonContainer = jp.jsonContainer; break; } } } }

    将json转为对象主要是通过JsonProxy类进行的。

    /// <summary>
            /// json代理类   Create By  YZR
            /// </summary>
            public class JosnProxy
            {
                //json字符流
                private char[] jsonArray;
                //json字符串
                private string jsonString;
                public string JsonString
                {
                    get { return jsonString; }
                    set { jsonString = value; }
                }
                //json字符串长度
                private int jsonLength;
                public int JsonLength
                {
                    get { return jsonLength; }
                    set { jsonLength = value; }
                }
    
                public JosnProxy(string _jsonString)
                {
                    this.jsonString = _jsonString;
                    toArray();
                    jsonList = new List<JsonClass>();
                    jsonLength = jsonString.Length;
                }
                /// <summary>
                /// 得到json字符流
                /// </summary>
                /// <returns></returns>
                public char[] toArray()
                {
                    jsonArray = jsonString.ToCharArray();
                    return jsonArray;
                }
    
                /// <summary>
                /// json对象
                /// </summary>
                private List<JsonClass> jsonList;
                public List<JsonClass> JsonList
                {
                    get { return jsonList; }
                    set { jsonList = value; }
                }
    
                /// <summary>
                /// 初始化
                /// </summary>
                public void init()
                {
                    switch (JsonParse.ToJsonCode(jsonArray[0]))
                    {
                        case JsonKey.LeftBraces:
                            Begin(JsonType.Object);
                            break;
                        case JsonKey.LeftMiddle:
                            Begin(JsonType.List);
                            break;
                        case JsonKey.Colon:
                        case JsonKey.Comma:
                        case JsonKey.RightBraces:
                        case JsonKey.RightMiddle:
                            break;//不正常的json字符串
                        default:
                            break;//包含其他字符串的不正常字符串
    
    
                    }
    
                }
                public void init(JsonKey JK)//JsonParse.ToJsonCode(jsonArray[0])
                {
                    switch (JK)
                    {
                        case JsonKey.LeftBraces:
                            Begin(JsonType.Object);
                            break;
                        case JsonKey.LeftMiddle:
                            Begin(JsonType.Object);
                            break;
                        case JsonKey.Colon:
                        case JsonKey.Comma:
                        case JsonKey.RightBraces:
                        case JsonKey.RightMiddle:
                            break;//不正常的json字符串
                        default:
                            break;//包含其他字符串的不正常字符串
    
    
                    }
    
                }
                private void Begin(JsonType _jsonType)
                {
                    this.JsonType = _jsonType;
                    JsonObject jObject = new JsonObject();
                    int i = 1;
                    string jsonClassKey = string.Empty;
                    string jsonClassValue = string.Empty;
                    if (_jsonType == JsonType.List)
                    {
    
                        #region 处理集合
                        List<string> list = getJsonObject(jsonString);
                        foreach (string item in list)
                        {
                            SubJsonType subType = JsonParse.JudgeJsonType(item);//对象
                            if (subType == SubJsonType.JsonClass)
                            {
                                JosnProxy jp = new JosnProxy(item);
                                jp.init();
                                List<JsonClass> lc = jp.JsonList;
                                jObject.jsonContainer.Add(lc);
                            }
                            else if (subType == SubJsonType.Object)//
                            {
                                jObject.valueContainer.Add(item);
                            }
    
                        }
                        #endregion
                        jsonContainer = jObject.jsonContainer;//对象集合
                        valueContainer = jObject.valueContainer;//值集合
                    }
                    else
                    {
                        #region 处理对象
                        DealJsonList(i, ref jObject, jsonClassKey, jsonClassValue);
                        #endregion
                        jsonList = jObject.jsonClassList;//对象
                        //jsonContainer = jObject.jsonContainer;//对象集合
                        //valueContainer = jObject.valueContainer;//值集合
                    }
    
    
                }
                private void DealJsonList(int i, ref JsonObject jObject, string jsonClassKey, string jsonClassValue)
                {
    
                    while (i > 0 && i < jsonLength)//处理对象
                    {
                        if (jsonArray[i] == '"')
                        {
                            int EndIndex = FingRightBraces(i);
                            //从开始索引为i到结束索引为EndIndex截取字符串,封装为JsonClass对象,保存在JsonObject对象的
                            if (string.IsNullOrEmpty(jsonClassKey))
                            {
                                jsonClassKey = jsonString.Substring(i, EndIndex - i + 1);
                            }
                            else
                            {
                                jsonClassValue = jsonString.Substring(i, EndIndex - i + 1);
                                JsonClass jc = new JsonClass(jsonClassKey, jsonClassValue);
                                jObject.jsonClassList.Add(jc);
                                jsonClassKey = string.Empty;
                            }
    
                            i = EndIndex + 1;
    
    
    
                        }
                        else if (jsonArray[i] == ',')
                        {
                            i++;
                        }
                        else if (jsonArray[i] == '}')
                        {
                            i = 0;
                        }
                        else if (jsonArray[i] == ':')
                        {
                            i++;
                        }
                        else if (jsonArray[i] == '{')//对象
                        {
                            int _right = jsonString.IndexOf('}', i);
                            int _left = jsonString.IndexOf('{', i);//嵌套
                            if (_right != -1)
                            {
                                jsonClassValue = jsonString.Substring(i, _right - i + 1);
                            }
                            JsonClass subJsonClass = new JsonClass(jsonClassValue);
                            JsonClass jc = new JsonClass(jsonClassKey, subJsonClass.Jcs);
                            jc.ValueType = SubJsonType.JsonClass;
                            jObject.jsonClassList.Add(jc);
                            jsonClassKey = string.Empty;
                            i = _right + 1;
                        }
                        else if (jsonArray[i] == '[')
                        {
                            int _right = jsonString.IndexOf(']', i);
                            int _left = jsonString.IndexOf('[', i + 1);
                            SubJsonType subType = SubJsonType.None;
                            if (_left != -1 && _left < _right)//嵌套
                            {
                                //int Nesting = FindNestingCount(jsonString, i, _right, '[');//嵌套数
                                // _right = FindRight(jsonString, _right, ']', Nesting);
                                _right = SeniorFindIndex(jsonString, i, '[', ']');
                                jsonClassValue = jsonString.Substring(i, _right - i + 1);
                                subType = JsonParse.JudgeJsonType(jsonClassValue.Substring(1, jsonClassValue.Length - 2));
                            }
                            else
                            {
                                jsonClassValue = jsonString.Substring(i, _right - i + 1);
                                subType = JsonParse.JudgeJsonType(jsonClassValue.Substring(1, jsonClassValue.Length - 2));
    
                            }
                            JsonClass subJsonClass = new JsonClass(jsonClassValue);
                            //JsonClass[] jsc = new JsonClass[subJsonClass.Jcs.Length];
                            //jsc[0] = subJsonClass;
                            JsonClass jc;
                            if (subType == SubJsonType.Object)
                            {
    
                                //jObject.valueContainer = subJsonClass.ValueContainer;
                                jc = new JsonClass(jsonClassKey, subJsonClass.ValueContainer);
                                jc.ValueType = SubJsonType.JslnContainer;//json集合(值集合)
                                jc.FullString = jsonClassKey + ":" + jsonClassValue;//构造函数没赋值fullString,所以需要在这里补上
                                jObject.jsonClassList.Add(jc);
    
                            }
                            else if (subType == SubJsonType.JsonClass)
                            {
                                jc = new JsonClass();
                                jc.Key = jsonClassKey;
                                jc.JsonContainer = subJsonClass.JsonContainer;
                                jc.ValueType = SubJsonType.JslnContainer;
                                jc.FullString = jsonClassKey + ":" + jsonClassValue;
                                jObject.jsonClassList.Add(jc);
                            }
                            else
                            {
                                jc = new JsonClass();
                            }
    
    
    
                            jsonClassKey = string.Empty;
                            i = _right + 1;
                        }
                        else if (jsonArray[i] == ']')
                        {
    
                        }
                        else//数值或者布尔值
                        {
                            int index = jsonString.IndexOf(',', i);
                            if (index == -1)
                            {
                                index = jsonString.IndexOf('}', i);
    
                            }
                            jsonClassValue = jsonString.Substring(i, index - i);
                            JsonClass jc = new JsonClass(jsonClassKey, jsonClassValue);
                            jc.ValueType = SubJsonType.Object;
                            jObject.jsonClassList.Add(jc);
                            jsonClassKey = string.Empty;
                            i++;
                        }
    
                    }
                }
    
                private int FingRightBraces(int StartIndex)
                {
                    return jsonString.IndexOf('"', StartIndex + 1);
                }
    
                /// <summary>
                /// json集合(对象集合)
                /// </summary>
                public List<List<JsonClass>> jsonContainer;
    
                /// <summary>
                /// json集合(值集合)
                /// </summary>
                public List<object> valueContainer;
    
                private JsonType jsonType;
    
                public JsonType JsonType
                {
                    get { return jsonType; }
                    set { jsonType = value; }
                }
    
                public SubJsonType getType(string _str)
                {
                    char[] arr = _str.ToCharArray();
                    switch (JsonParse.ToJsonCode(arr[0]))
                    {
                        case JsonKey.LeftBraces:
                            return SubJsonType.JsonClass;
                        case JsonKey.LeftMiddle:
                            return SubJsonType.JslnContainer;
                        case JsonKey.Quote:
                        case JsonKey.None:
                            return SubJsonType.Object;
                        default:
                            return SubJsonType.None;
                    }
                }
    
                /// <summary>
                /// 以单个的json对象字符串加入List中
                /// </summary>
                /// <param name="jsonContainer"></param>
                /// <returns></returns>
                public List<string> getJsonObject(string jsonContainer)
                {
                    jsonContainer = jsonContainer.Trim();
                    char[] arr = jsonContainer.ToCharArray();
                    if (arr[0] != '[')
                    {
                        return null;
                    }
                    int i = 1;
                    List<string> list = new List<string>();
                    bool StartContact = false;
                    int BeginTemp = 0;
                    while (i > 0 && i < arr.Length)
                    {
                        if (arr[i] == '{')
                        {
                            int _right = jsonContainer.IndexOf('}', i);
                            int _left = jsonContainer.IndexOf('{', i + 1);
                            if (_left != -1 && _left < _right)//嵌套
                            {
                                //int Nesting = FindNestingCount(jsonContainer, i, _right, '{');//嵌套数
                                //_right = FindRight(jsonContainer, _right, '}', Nesting);
                                _right = SeniorFindIndex(jsonContainer, i, '{', '}');
    
                            }
                            list.Add(jsonContainer.Substring(i, _right - i + 1));
                            i = _right + 1;
                        }
                        else if (arr[i] == ',')
                        {
                            if (StartContact)
                            {
                                list.Add(jsonContainer.Substring(BeginTemp, i - BeginTemp));
                                StartContact = false;
                            }
                            i++;
                        }
                        else if (arr[i] == ']')
                        {
                            //结束
                            if (StartContact)
                            {
                                list.Add(jsonContainer.Substring(BeginTemp, i - BeginTemp));
                                StartContact = false;
                            }
                            i++;
                        }
                        else if (arr[i] == '"')//Object之字符串类型   Object之数值字符串或者布尔类型字符串
                        {
                            if (!StartContact)
                            {
                                StartContact = true;
                                BeginTemp = i;
                            }
                            else
                            {
                                list.Add(jsonContainer.Substring(BeginTemp + 1, i - BeginTemp - 1));
                                StartContact = false;
                            }
    
    
    
                            i++;
                        }
                        else
                        {
                            //list.Add(arr[i].ToString());
                            if (!StartContact)
                            {
                                StartContact = true;
                                BeginTemp = i;
                            }
                            //else
                            //{
                            //    list.Add(jsonContainer.Substring(BeginTemp + 1, i - BeginTemp - 1));
                            //    StartContact = false;
                            //}
                            i++;
                        }
                    }
                    return list;
    
                }
    
                public int SeniorFindIndex(string jsonString, int BeginIndex, char left_word, char right_word)
                {
                    string subStr = string.Empty;
                    subStr = jsonString.Substring(BeginIndex + 1, jsonString.Length - BeginIndex - 1);
                    List<int> LeftList = new List<int>();
                    List<int> RightList = new List<int>();
                    int _left = 0;
                    int _rigth = 0;
                    while (_left != -1 && _rigth != -1)
                    {
                        _left = subStr.IndexOf(left_word, _left);
                        if (_left != -1)
                        {
                            LeftList.Add(_left);
                            _left++;
                        }
                        _rigth = subStr.IndexOf(right_word, _rigth);
                        if (_rigth != -1)
                        {
                            RightList.Add(_rigth);
                            _rigth++;
                        }
                    }
                    int k = 0;
                    bool run = true;
                    while (RightList[k] > LeftList[k] && run)
                    {
                        if (LeftList.Count == k + 1)
                        {
                            run = false;
                        }
                        else
                        {
                            k++;
                        }
                    }
    
                    return run == true ? RightList[k] + BeginIndex + 1 : RightList[k + 1] + BeginIndex + 1;
                }
                /// <summary>
                /// 单层嵌套
                /// </summary>
                /// <param name="jsonString"></param>
                /// <param name="BeginIndex"></param>
                /// <param name="left_word"></param>
                /// <param name="right_word"></param>
                /// <returns></returns>
                public int FindIndex(string jsonString, int BeginIndex, char left_word, char right_word)
                {
    
                    //[  []  [] .....( ] 找到这里的索引)
                    string subStr = string.Empty;
                    subStr = jsonString.Substring(BeginIndex + 1, jsonString.Length - BeginIndex - 1);
    
                    char[] arr = jsonString.ToCharArray();
                    int _left = 0;
                    int _rigth = 0;
                    while (_left != -1)
                    {
                        _left = subStr.IndexOf(left_word, _left);
                        if (_left != -1)
                        {
                            _left++;
                        }
                        _rigth = subStr.IndexOf(right_word, _rigth);
                        _rigth++;
                    }
                    char temp = arr[_rigth + BeginIndex];
                    return _rigth + BeginIndex;
                }
                public int FindNestingCount(string jsonString, int BeginIndex, int LastIndex, char word)
                {
                    string subStr = jsonString.Substring(BeginIndex + 1, LastIndex - BeginIndex + 1);
                    int Appear = GetStrCount(subStr, word);//出现次数
                    return Appear;
                }
                public int FindRight(string jsonString, int BeginIndex, char Word, int Pass)
                {
                    int count = 0;
                    int StartIndex = BeginIndex;
                    while (count <= Pass)
                    {
                        StartIndex = jsonString.IndexOf(Word, StartIndex);
                        StartIndex++;
                        count++;
                    }
                    return StartIndex - 1;
                }
                /// <summary>
                /// 获得字符在字符串中出现的次数
                /// </summary>
                /// <param name="list"></param>
                /// <param name="str"></param>
                /// <returns></returns>
                public int GetStrCount(string str, char Word)
                {
                    int count = 0;
                    char[] arr = str.ToCharArray();
                    for (int i = 0; i < arr.Length; i++)
                    {
                        if (arr[i] == Word)
                        {
                            count++;
                        }
                    }
                    return count;
                }
            }
    View Code

    注意:这里并没有加上异常处理,所以使用之前需要先确认json是否是一个符合规范并且正确格式的json字符串。

    RJson的几个辅助类:

            internal class JsonObject
            {
                public List<JsonClass> jsonClassList = new List<JsonClass>();//对象
                public List<List<JsonClass>> jsonContainer = new List<List<JsonClass>>();//对象集合
                public List<object> valueContainer = new List<object>();//值集合
            }
            public enum SubJsonType
            {
                Object,//
                JsonClass,//对象
                JslnContainer,//集合
                None
            }
            public enum JsonType
            {
                Object,//对象
                List,//集合
                None
            }
            public enum JsonKey
            {
                LeftMiddle,//左中括号  [
    
                RightMiddle,//右中括号  ]
    
                LeftBraces,//左大括号   {
    
                RightBraces,//右大括号  }
    
                Comma,//逗号
    
                Colon,//冒号
    
                Quote,//双引号
    
                None
            }
            public class JsonParse
            {
                /// <summary>
                /// 判断子对象的json对象
                /// </summary>
                /// <param name="SubString"></param>
                /// <returns></returns>
                public static SubJsonType JudgeJsonType(string SubString)
                {
                    char[] arr = SubString.ToCharArray();
                    if (SubString.IndexOf('{') == -1 && SubString.IndexOf('[') == -1)
                    {
                        return SubJsonType.Object;//数值
                    }
                    else if (arr[0] == '[')
                    {
                        return SubJsonType.JslnContainer;
                    }
                    else if (arr[0] == '{')
                    {
                        return SubJsonType.JsonClass;
                    }
                    else return SubJsonType.None;
                }
                /// <summary>
                /// JsonCode=>String
                /// </summary>
                /// <param name="JsonCode"></param>
                /// <returns></returns>
                public static string ToJsonString(JsonKey JsonCode)
                {
                    if (JsonCode == null)
                    {
                        return "";
                    }
                    switch (JsonCode)
                    {
                        case JsonKey.LeftMiddle:
                            return "[";
                        case JsonKey.RightMiddle:
                            return "]";
                        case JsonKey.LeftBraces:
                            return "{";
                        case JsonKey.RightBraces:
                            return "}";
                        case JsonKey.Comma:
                            return ",";
                        case JsonKey.Colon:
                            return ":";
                        default:
                            return "";
    
                    }
                }
                /// <summary>
                /// String=>JsonKey
                /// </summary>
                /// <param name="jsonString"></param>
                /// <returns></returns>
                public static JsonKey ToJsonCode(string jsonString)
                {
                    if (string.IsNullOrEmpty(jsonString))
                    {
                        return JsonKey.None;
                    }
                    switch (jsonString)
                    {
                        case "[":
                            return JsonKey.LeftMiddle;
                        case "]":
                            return JsonKey.RightMiddle;
                        case "{":
                            return JsonKey.LeftBraces;
                        case "}":
                            return JsonKey.RightBraces;
                        case ",":
                            return JsonKey.Comma;
                        case ":":
                            return JsonKey.Colon;
                        case """:
                            return JsonKey.Quote;
                        default:
                            return JsonKey.None;
    
                    }
                }
                /// <summary>
                /// char=>JsonKey
                /// </summary>
                /// <param name="jsonString"></param>
                /// <returns></returns>
                public static JsonKey ToJsonCode(char jsonString)
                {
                    if (jsonString == null)
                    {
                        return JsonKey.None;
                    }
                    switch (jsonString)
                    {
                        case '[':
                            return JsonKey.LeftMiddle;
                        case ']':
                            return JsonKey.RightMiddle;
                        case '{':
                            return JsonKey.LeftBraces;
                        case '}':
                            return JsonKey.RightBraces;
                        case ',':
                            return JsonKey.Comma;
                        case ':':
                            return JsonKey.Colon;
                        case '"':
                            return JsonKey.Quote;
                        default:
                            return JsonKey.None;
    
                    }
                }
    
            }

    最后展示一下Demo:

            RJson 1.0版本问题:
            1.josn字符串本身包含七个关键词需要处理
            2.json字符串的异常处理
            3.json字符串的验证
    
            //测试代码如下:
            static void Main(string[] args)
            {
                //JsonHelper.JosnString = "{"number":2,"who":"YZR","GrilFirend":{"Name":"LYF","number":3},"Firend":{"Name":"Dog","number":4,"Age":1}}";
                //JsonHelper.JosnString = "[{"Name":"YZR","number":1,"Firend":{"Name":"Dog","number":4,"Age":1}},{"Name":"LYF","number":2,"Firend":{"Name":"Dog","number":4,"Age":1,"Type":{"Sex":"Man","City":"GZ"}}},{"Name":"Dog","number":3}]";
                //JsonHelper.JosnString = "{"number":2,"who":["YZR","LYF"],"Firend":[{"Name":"Dog","number":4,"Age":1},{"Name":"Dog","number":4,"Age":1}]}";
                //JsonHelper.JosnString = "{"number":2,"Firend":[{"Name":"YZR","Color":["1","2"]},{"Name":"LYF","Color":["3","4"]}]}";
                JsonHelper.JosnString = "{"number":2,"Firend":[{"Name":"YZR","Color":[1,2]},{"Name":"LYF","Color":[3,4]}]}";
                //JsonHelper.JosnString = "[{"number":2,"Firend":[{"Name":"YZR","Color":[1,2]},{"Name":"LYF","Color":[3,4]}]},{"number":1}]";
                //JsonHelper.JosnString = "[{"number":2,"Firend":[{"Name":"YZR","Color":[1,2]},{"Name":"LYF","Color":[3,4]},{"number":1}]}]";
                int len = JsonHelper.JosnString.Length;
    
                Console.WriteLine("整个长度为:" + len + ",第二个字符是:" + JsonHelper.JosnString[1]);
    
    
                JosnProxy jp = new JosnProxy(JsonHelper.JosnString);
                jp.init();
                if (jp.JsonType == JsonType.Object)//json对象
                {
                    List<JsonClass> jsonClasslist = jp.JsonList;
                    #region 业务处理
                    foreach (JsonClass item in jsonClasslist)
                    {
                        switch (item.ValueType)
                        {
                            case SubJsonType.Object:
                                DealObject();
                                break;
                            case SubJsonType.JsonClass:
                                DealJsonClass(item);
                                break;
                            default:
                                break;
                        }
                    } 
                    #endregion
                }
                else//json集合(对象集合)
                {
                    List<List<JsonClass>> list = jp.jsonContainer;//json集合
                    #region 业务处理
                    
                    #endregion
                }
    
            }
    
            static void DealObject()
            {
                //Do Some Tings
            }
            static void DealJsonClass(JsonClass jc)
            {
                //Do Some Tings
                string jsonString = jc.FullString;
            }
  • 相关阅读:
    一段滚动文字的js (jQuery)
    VB ASP 使用 now() 时默认格式调整方法
    解决标题过长的CSS
    javascript Spline代码
    统计学中的几个重要的分布
    网页游戏开发秘笈 PDF扫描版
    网页设计与开发——HTML、CSS、JavaScript (王津涛) pdf扫描版
    网页设计与开发:HTML、CSS、JavaScript实例教程 (郑娅峰) pdf扫描版
    网页DIV+CSS布局和动画美化全程实例 (陈益材) 随书光盘
    实用掌中宝--HTML&CSS常用标签速查手册 PDF扫描版
  • 原文地址:https://www.cnblogs.com/Francis-YZR/p/5385941.html
Copyright © 2011-2022 走看看