博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity3D中使用MiniJson解析json的例子
阅读量:6343 次
发布时间:2019-06-22

本文共 9464 字,大约阅读时间需要 31 分钟。

json:

---------------------------------

{

    "name":"中国",
    "province":[
        {
            "name":"黑龙江",
            "cities":{
                "city":[
                    "哈尔滨",
                    "大庆"
                ]
            }
        },
        {
            "name":"广东",
            "cities":{
                "city":[
                    "广州",
                    "深圳",
                    "珠海"
                ]
            }
        },
        {
            "name":"台湾",
            "cities":{
                "city":[
                    "台北",
                    "高雄"
                ]
            }
        },
        {
            "name":"新疆",
            "cities":{
                "city":[
                    "乌鲁木齐"
                ]
            }
        }
    ]
}

 --------------------------------

 

public class JsonDeserialize {    protected string url = "http://localhost:8080/AssetBundleData/Web/Singlea/";}

using UnityEngine;using System.Collections.Generic;public class ChinaJsonDeserialize : JsonDeserialize {    private China _china;    public China china    {        get         {            return _china;        }    }    public ChinaJsonDeserialize(string jsonData)    {        _china = new China();        ParseJson(jsonData);    }    void ParseJson(string jsonData)    {                if (string.IsNullOrEmpty(jsonData))        {            Debug.LogError("ChinaJson is null or empty");            return;        }         Dictionary
jsonObjects = MiniJSON.Json.Deserialize(jsonData) as Dictionary
; _china.chinaName = jsonObjects["name"].ToString(); _china.province = new List
(); List
provinceList = jsonObjects["province"] as List; foreach (var i in provinceList) { Dictionary
province = i as Dictionary
; Province provinceObj = new Province(); provinceObj.provinceName = province["name"].ToString(); provinceObj.city = new List
(); Dictionary
citesDic = province["cities"] as Dictionary
; List
childCitesList = citesDic["city"] as List; foreach (var childCity in childCitesList) { City city = new City(); city.cityName = childCity.ToString(); provinceObj.city.Add(city); } _china.province.Add(provinceObj); } }}public class China{ public string chinaName; public List
province;}public class Province{ public string provinceName; public List
city;}public class City{ public string cityName;}

using UnityEngine;using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Text;namespace MiniJSON {       public static class Json {        ///         /// Parses the string json into a value        ///         /// A JSON string.        /// 
An List
, a Dictionary
, a double, an integer,a string, null, true, or false 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 = " \t\n\r"; const string WORD_BREAK = " \t\n\r{}[],:\""; 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
ParseObject() { Dictionary
table = new Dictionary
(); // 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
ParseArray() { List array = new List(); // 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('\b'); break; case 'f': s.Append('\f'); break; case 'n': s.Append('\n'); break; case 'r': s.Append('\r'); break; case 't': s.Append('\t'); 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; } } } /// /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string /// /// A Dictionary
/ List
///
A JSON encoded string, or null if object 'json' is not serializable
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 '\b': builder.Append("\\b"); break; case '\f': builder.Append("\\f"); break; case '\n': builder.Append("\\n"); break; case '\r': builder.Append("\\r"); break; case '\t': 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()); } } } }}

 

 

 

转载地址:http://gwula.baihongyu.com/

你可能感兴趣的文章
Dwr3.0纯注解(纯Java Code配置)配置与应用浅析三之后端反向调用前端
查看>>
Ubuntu下安装遨游浏览器
查看>>
自定义Linux service脚本
查看>>
微信开发之发红包
查看>>
一键lnmp脚本&&php扩展模块安装(适用于CENTOS6.X系列)
查看>>
二维观察---文字的裁剪
查看>>
矩形覆盖
查看>>
ICMP
查看>>
界面设计模式(第2版)(全彩)
查看>>
linux 的IP配置和网络问题的排查(补充)
查看>>
解决VMware Workstation错误:未能锁定文件
查看>>
CentOS6 手动编译升级 gcc
查看>>
memcached的安装与开启脚本
查看>>
Linux与Window字符集~~伤不起的幽灵空白符
查看>>
zabbix 邮件报警 -- sendmail
查看>>
JavaScript异步编程
查看>>
tcpdump用法小记
查看>>
MySQL基础安全注意细节
查看>>
Oracle随机函数—dbms_random
查看>>
pvr 批量转换
查看>>