zoukankan      html  css  js  c++  java
  • Unity json

    MiniJSON.cs

    using UnityEngine;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    
    namespace MiniJSON
    {
    
        public static class Json
        {
            /// <summary>
            /// Parses the string json into a value
            /// </summary>
            /// <param name="json">A JSON string.</param>
            /// <returns>An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false</returns>
            public static object Deserialize(string json)
            {
                // save the string for debug information
                if (json == null)
                {
                    return null;
                }
    
                return Parser.Parse(json);
            }
    
            sealed class Parser : IDisposable
            {
                const string WHITE_SPACE = " 	
    
    ";
                const string WORD_BREAK = " 	
    
    {}[],:"";
    
                enum TOKEN
                {
                    NONE,
                    CURLY_OPEN,
                    CURLY_CLOSE,
                    SQUARED_OPEN,
                    SQUARED_CLOSE,
                    COLON,
                    COMMA,
                    STRING,
                    NUMBER,
                    TRUE,
                    FALSE,
                    NULL
                };
    
                StringReader json;
    
                Parser(string jsonString)
                {
                    json = new StringReader(jsonString);
                }
    
                public static object Parse(string jsonString)
                {
                    using (var instance = new Parser(jsonString))
                    {
                        return instance.ParseValue();
                    }
                }
    
                public void Dispose()
                {
                    json.Dispose();
                    json = null;
                }
    
                Dictionary<string, object> ParseObject()
                {
                    Dictionary<string, object> table = new Dictionary<string, object>();
    
                    // ditch opening brace
                    json.Read();
    
                    // {
                    while (true)
                    {
                        switch (NextToken)
                        {
                            case TOKEN.NONE:
                                return null;
                            case TOKEN.COMMA:
                                continue;
                            case TOKEN.CURLY_CLOSE:
                                return table;
                            default:
                                // name
                                string name = ParseString();
                                if (name == null)
                                {
                                    return null;
                                }
    
                                // :
                                if (NextToken != TOKEN.COLON)
                                {
                                    return null;
                                }
                                // ditch the colon
                                json.Read();
    
                                // value
                                table[name] = ParseValue();
                                break;
                        }
                    }
                }
    
                List<object> ParseArray()
                {
                    List<object> array = new List<object>();
    
                    // ditch opening bracket
                    json.Read();
    
                    // [
                    var parsing = true;
                    while (parsing)
                    {
                        TOKEN nextToken = NextToken;
    
                        switch (nextToken)
                        {
                            case TOKEN.NONE:
                                return null;
                            case TOKEN.COMMA:
                                continue;
                            case TOKEN.SQUARED_CLOSE:
                                parsing = false;
                                break;
                            default:
                                object value = ParseByToken(nextToken);
    
                                array.Add(value);
                                break;
                        }
                    }
    
                    return array;
                }
    
                object ParseValue()
                {
                    TOKEN nextToken = NextToken;
                    return ParseByToken(nextToken);
                }
    
                object ParseByToken(TOKEN token)
                {
                    switch (token)
                    {
                        case TOKEN.STRING:
                            return ParseString();
                        case TOKEN.NUMBER:
                            return ParseNumber();
                        case TOKEN.CURLY_OPEN:
                            return ParseObject();
                        case TOKEN.SQUARED_OPEN:
                            return ParseArray();
                        case TOKEN.TRUE:
                            return true;
                        case TOKEN.FALSE:
                            return false;
                        case TOKEN.NULL:
                            return null;
                        default:
                            return null;
                    }
                }
    
                string ParseString()
                {
                    StringBuilder s = new StringBuilder();
                    char c;
    
                    // ditch opening quote
                    json.Read();
    
                    bool parsing = true;
                    while (parsing)
                    {
    
                        if (json.Peek() == -1)
                        {
                            parsing = false;
                            break;
                        }
    
                        c = NextChar;
                        switch (c)
                        {
                            case '"':
                                parsing = false;
                                break;
                            case '\':
                                if (json.Peek() == -1)
                                {
                                    parsing = false;
                                    break;
                                }
    
                                c = NextChar;
                                switch (c)
                                {
                                    case '"':
                                    case '\':
                                    case '/':
                                        s.Append(c);
                                        break;
                                    case 'b':
                                        s.Append('');
                                        break;
                                    case 'f':
                                        s.Append('f');
                                        break;
                                    case 'n':
                                        s.Append('
    ');
                                        break;
                                    case 'r':
                                        s.Append('
    ');
                                        break;
                                    case 't':
                                        s.Append('	');
                                        break;
                                    case 'u':
                                        var hex = new StringBuilder();
    
                                        for (int i = 0; i < 4; i++)
                                        {
                                            hex.Append(NextChar);
                                        }
    
                                        s.Append((char)Convert.ToInt32(hex.ToString(), 16));
                                        break;
                                }
                                break;
                            default:
                                s.Append(c);
                                break;
                        }
                    }
    
                    return s.ToString();
                }
    
                object ParseNumber()
                {
                    string number = NextWord;
    
                    if (number.IndexOf('.') == -1)
                    {
                        long parsedInt;
                        Int64.TryParse(number, out parsedInt);
                        return parsedInt;
                    }
    
                    double parsedDouble;
                    Double.TryParse(number, out parsedDouble);
                    return parsedDouble;
                }
    
                void EatWhitespace()
                {
                    while (WHITE_SPACE.IndexOf(PeekChar) != -1)
                    {
                        json.Read();
    
                        if (json.Peek() == -1)
                        {
                            break;
                        }
                    }
                }
    
                char PeekChar
                {
                    get
                    {
                        return Convert.ToChar(json.Peek());
                    }
                }
    
                char NextChar
                {
                    get
                    {
                        return Convert.ToChar(json.Read());
                    }
                }
    
                string NextWord
                {
                    get
                    {
                        StringBuilder word = new StringBuilder();
    
                        while (WORD_BREAK.IndexOf(PeekChar) == -1)
                        {
                            word.Append(NextChar);
    
                            if (json.Peek() == -1)
                            {
                                break;
                            }
                        }
    
                        return word.ToString();
                    }
                }
    
                TOKEN NextToken
                {
                    get
                    {
                        EatWhitespace();
    
                        if (json.Peek() == -1)
                        {
                            return TOKEN.NONE;
                        }
    
                        char c = PeekChar;
                        switch (c)
                        {
                            case '{':
                                return TOKEN.CURLY_OPEN;
                            case '}':
                                json.Read();
                                return TOKEN.CURLY_CLOSE;
                            case '[':
                                return TOKEN.SQUARED_OPEN;
                            case ']':
                                json.Read();
                                return TOKEN.SQUARED_CLOSE;
                            case ',':
                                json.Read();
                                return TOKEN.COMMA;
                            case '"':
                                return TOKEN.STRING;
                            case ':':
                                return TOKEN.COLON;
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                            case '-':
                                return TOKEN.NUMBER;
                        }
    
                        string word = NextWord;
    
                        switch (word)
                        {
                            case "false":
                                return TOKEN.FALSE;
                            case "true":
                                return TOKEN.TRUE;
                            case "null":
                                return TOKEN.NULL;
                        }
    
                        return TOKEN.NONE;
                    }
                }
            }
    
            /// <summary>
            /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
            /// </summary>
            /// <param name="json">A Dictionary<string, object> / List<object></param>
            /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
            public static string Serialize(object obj)
            {
                return Serializer.Serialize(obj);
            }
    
            sealed class Serializer
            {
                StringBuilder builder;
    
                Serializer()
                {
                    builder = new StringBuilder();
                }
    
                public static string Serialize(object obj)
                {
                    var instance = new Serializer();
    
                    instance.SerializeValue(obj);
    
                    return instance.builder.ToString();
                }
    
                void SerializeValue(object value)
                {
                    IList asList;
                    IDictionary asDict;
                    string asStr;
    
                    if (value == null)
                    {
                        builder.Append("null");
                    }
                    else if ((asStr = value as string) != null)
                    {
                        SerializeString(asStr);
                    }
                    else if (value is bool)
                    {
                        builder.Append(value.ToString().ToLower());
                    }
                    else if ((asList = value as IList) != null)
                    {
                        SerializeArray(asList);
                    }
                    else if ((asDict = value as IDictionary) != null)
                    {
                        SerializeObject(asDict);
                    }
                    else if (value is char)
                    {
                        SerializeString(value.ToString());
                    }
                    else
                    {
                        SerializeOther(value);
                    }
                }
    
                void SerializeObject(IDictionary obj)
                {
                    bool first = true;
    
                    builder.Append('{');
    
                    foreach (object e in obj.Keys)
                    {
                        if (!first)
                        {
                            builder.Append(',');
                        }
    
                        SerializeString(e.ToString());
                        builder.Append(':');
    
                        SerializeValue(obj[e]);
    
                        first = false;
                    }
    
                    builder.Append('}');
                }
    
                void SerializeArray(IList anArray)
                {
                    builder.Append('[');
    
                    bool first = true;
    
                    foreach (object obj in anArray)
                    {
                        if (!first)
                        {
                            builder.Append(',');
                        }
    
                        SerializeValue(obj);
    
                        first = false;
                    }
    
                    builder.Append(']');
                }
    
                void SerializeString(string str)
                {
                    builder.Append('"');
    
                    char[] charArray = str.ToCharArray();
                    foreach (var c in charArray)
                    {
                        switch (c)
                        {
                            case '"':
                                builder.Append("\"");
                                break;
                            case '\':
                                builder.Append("\\");
                                break;
                            case '':
                                builder.Append("\b");
                                break;
                            case 'f':
                                builder.Append("\f");
                                break;
                            case '
    ':
                                builder.Append("\n");
                                break;
                            case '
    ':
                                builder.Append("\r");
                                break;
                            case '	':
                                builder.Append("\t");
                                break;
                            default:
                                int codepoint = Convert.ToInt32(c);
                                if ((codepoint >= 32) && (codepoint <= 126))
                                {
                                    builder.Append(c);
                                }
                                else
                                {
                                    builder.Append("\u" + Convert.ToString(codepoint, 16).PadLeft(4, '0'));
                                }
                                break;
                        }
                    }
    
                    builder.Append('"');
                }
    
                void SerializeOther(object value)
                {
                    if (value is float
                        || value is int
                        || value is uint
                        || value is long
                        || value is double
                        || value is sbyte
                        || value is byte
                        || value is short
                        || value is ushort
                        || value is ulong
                        || value is decimal)
                    {
                        builder.Append(value.ToString());
                    }
                    else
                    {
                        SerializeString(value.ToString());
                    }
                }
            }
        }
    }


    UserJsonDeserialize.cs

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    /// <summary>
    /// 用户反序列化类
    /// </summary>
    public class UserJsonDeserialize
    {
        private List<UserModel> userList = new List<UserModel>();
        /// <summary>
        /// 用户实体集合
        /// </summary>
        public List<UserModel> UserList
        {
            get { return userList; }
            set { userList = value; }
        }
        /// <summary>
        /// 用户反序列化类构造函数
        /// </summary>
        /// <param name="jsonData">Json格式的字符串</param>
        public UserJsonDeserialize(string jsonData)
        {
            ParseJson(jsonData);
        }
        /// <summary>
        /// 解析Json
        /// </summary>
        /// <param name="jsonData">Json格式的字符串</param>
        private void ParseJson(string jsonData)
        {
            Dictionary<string, object> jsonObject = MiniJSON.Json.Deserialize(jsonData) as Dictionary<string, object>;
            List<object> userInfoListTemp = jsonObject["users"] as List<object>;
            foreach (var i in userInfoListTemp)
            {
                Dictionary<string, object> item = i as Dictionary<string, object>;
                UserModel u = new UserModel()
                {
                    Id = int.Parse(item["id"].ToString()),
                    UserId = item["userId"].ToString(),
                    UserPwd = item["userPwd"].ToString(),
                    Name = item["name"].ToString(),
                    BackgroundAtlasName = item["backgroundAtlasName"].ToString(),
                    SelfBackgroundSpriteName = item["selfBackgroundSpriteName"].ToString(),
                    OtherBackgroundSpriteName = item["otherBackgroundSpriteName"].ToString(),
                    HeadAtlasName = item["headAtlasName"].ToString(),
                    HeadSpriteName = item["headSpriteName"].ToString(),
                    HerosmallAtlasName = item["hero-smallAtlasName"].ToString(),
                    HerosmallSpriteName = item["hero-smallSpriteName"].ToString(),
                    BtnRightWidgetAtlasName = item["btnRightWidgetAtlasName"].ToString(),
                    SelfBtnRightWidgetSpriteName = item["selfBtnRightWidgetSpriteName"].ToString(),
                    OtherBtnRightWidgetSpriteName = item["otherBtnRightWidgetSpriteName"].ToString(),
                    Level = int.Parse(item["level"].ToString()),
                    HighScore = int.Parse(item["highScore"].ToString()),
                    Sign = item["sign"].ToString(),
                    Gold = int.Parse(item["gold"].ToString()),
                    Rune = int.Parse(item["rune"].ToString()),
                    Physical = int.Parse(item["physical"].ToString()),
                    CheckPoint = int.Parse(item["checkPoint"].ToString()),//N_INFO 初始化关卡点
                    Friends = item["friends"] as List<object>,
                    CheckPointStars = item["checkPointStars"] as List<object>
                };
                userList.Add(u);
            }
        }
    }


  • 相关阅读:
    GLSL预定义变量
    GLSL 内建函数
    GLSL语言基础
    svn:revert to this version 和 revert changes from this version的区别
    win7下搭建opengles2.0编程环境
    iconv字符编码转换
    矩阵-DirectX与OpenGL的不同
    NHibernate分页
    Web网站压力测试工具
    winform系统自动登录实现
  • 原文地址:https://www.cnblogs.com/nafio/p/9137491.html
Copyright © 2011-2022 走看看