惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
博客园 - 聂微东
罗磊的独立博客
W
WeLiveSecurity
博客园_首页
Scott Helme
Scott Helme
V
Visual Studio Blog
T
The Exploit Database - CXSecurity.com
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
Latest news
Latest news
L
Lohrmann on Cybersecurity
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
About on SuperTechFans
F
Full Disclosure
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 司徒正美
博客园 - Franky
C
CXSECURITY Database RSS Feed - CXSecurity.com
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
阮一峰的网络日志
阮一峰的网络日志
S
Schneier on Security
雷峰网
雷峰网
博客园 - 【当耐特】
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
MongoDB | Blog
MongoDB | Blog
J
Java Code Geeks
T
Tor Project blog
V
V2EX
爱范儿
爱范儿
C
Check Point Blog
T
Threatpost
Project Zero
Project Zero
量子位
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
I
Intezer
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

博客园 - _Sin

UnityGUI扩展实例:图片挖洞效果 Mask的反向实现 how to combine jpg + separate alpha in png? unity 全屏乱影 BlitMultiTap Unity Shader Billboard Unity Shaders Vertex & Fragment Shader入门 Unity3d三大光照渲染介绍 unity3d DefineManager 全局宏定义 Jenkins 搭建U3D自动发布 IOS Jenkins 搭建U3D自动发布 Android Color Space Max批量导出工具 手游比重 不得不存!UI设计新手不可错过的7条实用法则 Unity3D游戏在iOS上因为trampolines闪退的原因与解决办法 [Unity3D]引擎崩溃、异常、警告、BUG与提示总结及解决方法 unity3d ngui 字体制作 工具与示例 幽默的理解六种Socket I/O模型 Unity3d Socket C# sourecode Flex与c# Socket通信
C# 解析JSON数据格式 Mono 源码
_Sin · 2011-12-31 · via 博客园 - _Sin

做unity3d 的时候 要用JSON传数据,国外一个开源网站上找到的  http://www.opensource.org/licenses/lgpl-2.1.php

string encodedString = "[{\"strName\":\"0.5\",\"strScore\":300,\"strRank\":1},{\"strName\":\"sin\",\"strScore\":250,\"strRank\":2}]";

 ============================================下面是源码类==============================================

#define READABLE

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

/*

 * http://www.opensource.org/licenses/lgpl-2.1.php

 * JSONObject class     only support simple data...

 * for use with Unity

 * Copyright Matt Schoen 2010

 */

public class Nullable

{

    //Extend this class if you want to use the syntax

    //  if(myObject)

    //to check if it is not null

    public static implicit operator bool(Nullable o)

    {

        return (object)o != null;

    }

}

public class JSONObject : Nullable {

const int MAX_DEPTH = 1000;

public enum Type { NULL, STRING, NUMBER, OBJECT, ARRAY, BOOL }

public JSONObject parent;

public Type type = Type.NULL;

public ArrayList list = new ArrayList();

public ArrayList keys = new ArrayList();

public string str;

public double n;

public bool b;

public static JSONObject nullJO { get { return new JSONObject(JSONObject.Type.NULL); } }

public static JSONObject obj { get { return new JSONObject(JSONObject.Type.OBJECT); } }

public static JSONObject arr { get { return new JSONObject(JSONObject.Type.ARRAY); } }

public JSONObject(JSONObject.Type t) {

type = t;

switch(t) {

case Type.ARRAY:

list = new ArrayList();

break;

case Type.OBJECT:

list = new ArrayList();

keys = new ArrayList();

break;

}

}

public JSONObject(bool b) {

type = Type.BOOL;

this.b = b;

}

public JSONObject(float f) {

type = Type.NUMBER;

this.n = f;

}

public JSONObject(Dictionary<string, string> dic) {

type = Type.OBJECT;

foreach(KeyValuePair<string, string> kvp in dic){

keys.Add(kvp.Key);

list.Add(kvp.Value);

}

}

    public string strJson = "";

public JSONObject() { }

public JSONObject(string str) { //create a new JSONObject from a string (this will also create any children, and parse the whole string)

//Debug.Log(str);

        strJson = str;

if(str != null) {

#if(READABLE)

str = str.Replace("\\n", "");

str = str.Replace("\\t", "");

str = str.Replace("\\r", "");

str = str.Replace("\t", "");

str = str.Replace("\n", "");

str = str.Replace("\\", "");

#endif

if(str.Length > 0) {

if(string.Compare(str, "true", true) == 0) {

type = Type.BOOL;

b = true;

} else if(string.Compare(str, "false", true) == 0) {

type = Type.BOOL;

b = false;

} else if(str == "null") {

type = Type.NULL;

} else if(str[0] == '"') {

type = Type.STRING;

this.str = str.Substring(1, str.Length - 2);

} else {

try {

n = System.Convert.ToDouble(str);

type = Type.NUMBER;

} catch(System.FormatException) {

int token_tmp = 0;

/*

* Checking for the following formatting (www.json.org)

* object - {"field1":value,"field2":value}

* array - [value,value,value]

* value - string - "string"

* - number - 0.0

* - bool - true -or- false

* - null - null

*/

switch(str[0]) {

case '{':

type = Type.OBJECT;

keys = new ArrayList();

list = new ArrayList();

break;

case '[':

type = JSONObject.Type.ARRAY;

list = new ArrayList();

break;

default:

type = Type.NULL;

Debug.LogWarning("improper JSON formatting:" + str);

return;

}

int depth = 0;

bool openquote = false;

bool inProp = false;

for(int i = 1; i < str.Length; i++) {

if(str[i] == '\\') {

i++;

continue;

}

if(str[i] == '"')

openquote = !openquote;

if(str[i] == '[' || str[i] == '{')

depth++;

if(depth == 0 && !openquote) {

if(str[i] == ':' && !inProp) {

inProp = true;

try {

keys.Add(str.Substring(token_tmp + 2, i - token_tmp - 3));

} catch { Debug.Log(i + " - " + str.Length + " - " + str); }

token_tmp = i;

}

if(str[i] == ',') {

inProp = false;

list.Add(new JSONObject(str.Substring(token_tmp + 1, i - token_tmp - 1)));

token_tmp = i;

}

if(str[i] == ']' || str[i] == '}')

list.Add(new JSONObject(str.Substring(token_tmp + 1, i - token_tmp - 1)));

}

if(str[i] == ']' || str[i] == '}')

depth--;

}

}

}

}

} else {

type = Type.NULL; //If the string is missing, this is a null

}

}

public void AddField(bool val) { Add(new JSONObject(val)); }

public void AddField(float val) { Add(new JSONObject(val)); }

public void AddField(int val) { Add(new JSONObject(val)); }

public void Add(JSONObject obj) {

if(obj) { //Don't do anything if the object is null

if(type != JSONObject.Type.ARRAY) {

type = JSONObject.Type.ARRAY; //Congratulations, son, you're an ARRAY now

Debug.LogWarning("tried to add an object to a non-array JSONObject.  We'll do it for you, but you might be doing something wrong.");

}

list.Add(obj);

}

}

public void AddField(string name, bool val) { AddField(name, new JSONObject(val)); }

public void AddField(string name, float val) { AddField(name, new JSONObject(val)); }

public void AddField(string name, int val) { AddField(name, new JSONObject(val)); }

public void AddField(string name, string val) {

AddField(name, new JSONObject { type = JSONObject.Type.STRING, str = val });

}

public void AddField(string name, JSONObject obj) {

if(obj){ //Don't do anything if the object is null

if(type != JSONObject.Type.OBJECT){

type = JSONObject.Type.OBJECT; //Congratulations, son, you're an OBJECT now

Debug.LogWarning("tried to add a field to a non-object JSONObject.  We'll do it for you, but you might be doing something wrong.");

}

keys.Add(name);

list.Add(obj);

}

}

public void SetField(string name, JSONObject obj) {

if(HasField(name)) {

list.Remove(this[name]);

keys.Remove(name);

}

AddField(name, obj);

}

public JSONObject GetField(string name) {

if(type == JSONObject.Type.OBJECT)

for(int i = 0; i < keys.Count; i++)

if((string)keys[i] == name)

return (JSONObject)list[i];

return null;

}

public bool HasField(string name) {

if(type == JSONObject.Type.OBJECT)

for(int i = 0; i < keys.Count; i++)

if((string)keys[i] == name)

return true;

return false;

}

public void Clear() {

type = JSONObject.Type.NULL;

list.Clear();

keys.Clear();

str = "";

n = 0;

b = false;

}

public JSONObject Copy() {

return new JSONObject(print());

}

/*

* The Merge function is experimental. Use at your own risk.

*/

public void Merge(JSONObject obj) {

MergeRecur(this, obj);

}

static void MergeRecur(JSONObject left, JSONObject right) {

if(right.type == JSONObject.Type.OBJECT) {

for(int i = 0; i < right.list.Count; i++) {

if(right.keys[i] != null) {

string key = (string)right.keys[i];

JSONObject val = (JSONObject)right.list[i];

if(val.type == JSONObject.Type.ARRAY || val.type == JSONObject.Type.OBJECT) {

if(left.HasField(key))

MergeRecur(left[key], val);

else

left.AddField(key, val);

} else {

if(left.HasField(key))

left.SetField(key, val);

else

left.AddField(key, val);

}

}

}

}// else left.list.Add(right.list);

}

public string print() {

return print(0);

}

public string print(int depth) { //Convert the JSONObject into a stiring

if(depth++ > MAX_DEPTH) {

Debug.Log("reached max depth!");

return "";

}

string str = "";

switch(type) {

case Type.STRING:

str = "\"" + this.str + "\"";

break;

case Type.NUMBER:

str += n;

break;

case JSONObject.Type.OBJECT:

if(list.Count > 0) {

str = "{";

#if(READABLE) //for a bit more readability, comment the define above to save space

str += "\n";

depth++;

#endif

for(int i = 0; i < list.Count; i++) {

string key = (string)keys[i];

JSONObject obj = (JSONObject)list[i];

if(obj) {

#if(READABLE)

for(int j = 0; j < depth; j++)

str += "\t"; //for a bit more readability

#endif

str += "\"" + key + "\":";

str += obj.print(depth) + ",";

#if(READABLE)

str += "\n";

#endif

}

}

#if(READABLE)

str = str.Substring(0, str.Length - 1);

#endif

str = str.Substring(0, str.Length - 1);

str += "}";

} else str += "null";

break;

case JSONObject.Type.ARRAY:

if(list.Count > 0) {

str = "[";

#if(READABLE)

str += "\n"; //for a bit more readability

depth++;

#endif

foreach(JSONObject obj in list) {

if(obj) {

#if(READABLE)

for(int j = 0; j < depth; j++)

str += "\t"; //for a bit more readability

#endif

str += obj.print(depth) + ",";

#if(READABLE)

str += "\n"; //for a bit more readability

#endif

}

}

#if(READABLE)

str = str.Substring(0, str.Length - 1);

#endif

str = str.Substring(0, str.Length - 1);

str += "]";

}

break;

case Type.BOOL:

if(b)

str += "true";

else

str += "false";

break;

case Type.NULL:

str = "null";

break;

}

return str;

}

public JSONObject this[int index] {

get { return (JSONObject)list[index]; }

}

public JSONObject this[string index] {

get { return GetField(index); }

}

public override string ToString() {

return print();

}

public Dictionary<string, string> ToDictionary() {

if(type == Type.OBJECT) {

Dictionary<string, string> result = new Dictionary<string, string>();

for(int i = 0; i < list.Count; i++) {

JSONObject val = (JSONObject)list[i];

switch(val.type){

case Type.STRING: result.Add((string)keys[i], val.str); break;

case Type.NUMBER: result.Add((string)keys[i], val.n + ""); break;

case Type.BOOL: result.Add((string)keys[i], val.b + ""); break;

default: Debug.LogWarning("Omitting object: " + (string)keys[i] + " in dictionary conversion"); break;

}

}

return result;

} else Debug.LogWarning("Tried to turn non-Object JSONObject into a dictionary");

return null;

}

}