/*
http://www.cgsoso.com/forum-211-1.html
CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源!
CGSOSO 主打游戏开发,影视设计等CG资源素材。
插件如若商用,请务必官网购买!
daily assets update for try.
U should buy the asset from home store if u use it in your project!
*/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
namespace SimpleJSON
{
public class JSONNode
{
public virtual JSONNode this[int aIndex]
{
get
{
return null;
}
set
{
}
}
public virtual JSONNode this[string aKey]
{
get
{
return null;
}
set
{
}
}
public virtual string Value
{
get
{
return string.Empty;
}
set
{
}
}
public virtual int Count => 0;
public virtual IEnumerable Childs
{
get
{
yield break;
}
}
public IEnumerable DeepChilds
{
get
{
foreach (JSONNode C in Childs)
{
foreach (JSONNode deepChild in C.DeepChilds)
{
yield return deepChild;
}
}
}
}
public virtual int AsInt
{
get
{
int result = 0;
if (int.TryParse(Value, out result))
{
return result;
}
return 0;
}
set
{
Value = value.ToString();
}
}
public virtual float AsFloat
{
get
{
float result = 0f;
if (float.TryParse(Value, out result))
{
return result;
}
return 0f;
}
set
{
Value = value.ToString();
}
}
public virtual double AsDouble
{
get
{
double result = 0.0;
if (double.TryParse(Value, out result))
{
return result;
}
return 0.0;
}
set
{
Value = value.ToString();
}
}
public virtual bool AsBool
{
get
{
bool result = false;
if (bool.TryParse(Value, out result))
{
return result;
}
return !string.IsNullOrEmpty(Value);
}
set
{
Value = ((!value) ? "false" : "true");
}
}
public virtual JSONArray AsArray => this as JSONArray;
public virtual JSONClass AsObject => this as JSONClass;
public virtual void Add(string aKey, JSONNode aItem)
{
}
public virtual void Add(JSONNode aItem)
{
Add(string.Empty, aItem);
}
public virtual JSONNode Remove(string aKey)
{
return null;
}
public virtual JSONNode Remove(int aIndex)
{
return null;
}
public virtual JSONNode Remove(JSONNode aNode)
{
return aNode;
}
public override string ToString()
{
return "JSONNode";
}
public virtual string ToString(string aPrefix)
{
return "JSONNode";
}
public static implicit operator JSONNode(string s)
{
return new JSONData(s);
}
public static implicit operator string(JSONNode d)
{
return (!(d == null)) ? d.Value : null;
}
public static bool operator ==(JSONNode a, object b)
{
if (b == null && a is JSONLazyCreator)
{
return true;
}
return object.ReferenceEquals(a, b);
}
public static bool operator !=(JSONNode a, object b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
return object.ReferenceEquals(this, obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
internal static string Escape(string aText)
{
string text = string.Empty;
foreach (char c in aText)
{
switch (c)
{
case '\\':
text += "\\\\";
break;
case '"':
text += "\\\"";
break;
case '\n':
text += "\\n";
break;
case '\r':
text += "\\r";
break;
case '\t':
text += "\\t";
break;
case '\b':
text += "\\b";
break;
case '\f':
text += "\\f";
break;
default:
text += c;
break;
}
}
return text;
}
public static JSONNode Parse(string aJSON)
{
Stack stack = new Stack();
JSONNode jSONNode = null;
int i = 0;
string text = string.Empty;
string text2 = string.Empty;
bool flag = false;
for (; i < aJSON.Length; i++)
{
switch (aJSON[i])
{
case '{':
if (flag)
{
text += aJSON[i];
break;
}
stack.Push(new JSONClass());
if (jSONNode != null)
{
text2 = text2.Trim();
if (jSONNode is JSONArray)
{
jSONNode.Add(stack.Peek());
}
else if (text2 != string.Empty)
{
jSONNode.Add(text2, stack.Peek());
}
}
text2 = string.Empty;
text = string.Empty;
jSONNode = stack.Peek();
break;
case '[':
if (flag)
{
text += aJSON[i];
break;
}
stack.Push(new JSONArray());
if (jSONNode != null)
{
text2 = text2.Trim();
if (jSONNode is JSONArray)
{
jSONNode.Add(stack.Peek());
}
else if (text2 != string.Empty)
{
jSONNode.Add(text2, stack.Peek());
}
}
text2 = string.Empty;
text = string.Empty;
jSONNode = stack.Peek();
break;
case ']':
case '}':
if (flag)
{
text += aJSON[i];
break;
}
if (stack.Count == 0)
{
throw new Exception("JSON Parse: Too many closing brackets");
}
stack.Pop();
if (text != string.Empty)
{
text2 = text2.Trim();
if (jSONNode is JSONArray)
{
jSONNode.Add(text);
}
else if (text2 != string.Empty)
{
jSONNode.Add(text2, text);
}
}
text2 = string.Empty;
text = string.Empty;
if (stack.Count > 0)
{
jSONNode = stack.Peek();
}
break;
case ':':
if (flag)
{
text += aJSON[i];
break;
}
text2 = text;
text = string.Empty;
break;
case '"':
flag = ((byte)((flag ? 1 : 0) ^ 1) != 0);
break;
case ',':
if (flag)
{
text += aJSON[i];
break;
}
if (text != string.Empty)
{
if (jSONNode is JSONArray)
{
jSONNode.Add(text);
}
else if (text2 != string.Empty)
{
jSONNode.Add(text2, text);
}
}
text2 = string.Empty;
text = string.Empty;
break;
case '\t':
case ' ':
if (flag)
{
text += aJSON[i];
}
break;
case '\\':
i++;
if (flag)
{
char c = aJSON[i];
switch (c)
{
case 't':
text += '\t';
break;
case 'r':
text += '\r';
break;
case 'n':
text += '\n';
break;
case 'b':
text += '\b';
break;
case 'f':
text += '\f';
break;
case 'u':
{
string s = aJSON.Substring(i + 1, 4);
text += (char)int.Parse(s, NumberStyles.AllowHexSpecifier);
i += 4;
break;
}
default:
text += c;
break;
}
}
break;
default:
text += aJSON[i];
break;
case '\n':
case '\r':
break;
}
}
if (flag)
{
throw new Exception("JSON Parse: Quotation marks seems to be messed up.");
}
return jSONNode;
}
public virtual void Serialize(BinaryWriter aWriter)
{
}
public void SaveToStream(Stream aData)
{
BinaryWriter aWriter = new BinaryWriter(aData);
Serialize(aWriter);
}
public void SaveToCompressedStream(Stream aData)
{
throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
}
public void SaveToCompressedFile(string aFileName)
{
throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
}
public string SaveToCompressedBase64()
{
throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
}
public void SaveToFile(string aFileName)
{
Directory.CreateDirectory(new FileInfo(aFileName).Directory.FullName);
using (FileStream aData = File.OpenWrite(aFileName))
{
SaveToStream(aData);
}
}
public string SaveToBase64()
{
using (MemoryStream memoryStream = new MemoryStream())
{
SaveToStream(memoryStream);
memoryStream.Position = 0L;
return Convert.ToBase64String(memoryStream.ToArray());
}
}
public static JSONNode Deserialize(BinaryReader aReader)
{
JSONBinaryTag jSONBinaryTag = (JSONBinaryTag)aReader.ReadByte();
switch (jSONBinaryTag)
{
case JSONBinaryTag.Array:
{
int num2 = aReader.ReadInt32();
JSONArray jSONArray = new JSONArray();
for (int j = 0; j < num2; j++)
{
jSONArray.Add(Deserialize(aReader));
}
return jSONArray;
}
case JSONBinaryTag.Class:
{
int num = aReader.ReadInt32();
JSONClass jSONClass = new JSONClass();
for (int i = 0; i < num; i++)
{
string aKey = aReader.ReadString();
JSONNode aItem = Deserialize(aReader);
jSONClass.Add(aKey, aItem);
}
return jSONClass;
}
case JSONBinaryTag.Value:
return new JSONData(aReader.ReadString());
case JSONBinaryTag.IntValue:
return new JSONData(aReader.ReadInt32());
case JSONBinaryTag.DoubleValue:
return new JSONData(aReader.ReadDouble());
case JSONBinaryTag.BoolValue:
return new JSONData(aReader.ReadBoolean());
case JSONBinaryTag.FloatValue:
return new JSONData(aReader.ReadSingle());
default:
throw new Exception("Error deserializing JSON. Unknown tag: " + jSONBinaryTag);
}
}
public static JSONNode LoadFromCompressedFile(string aFileName)
{
throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
}
public static JSONNode LoadFromCompressedStream(Stream aData)
{
throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
}
public static JSONNode LoadFromCompressedBase64(string aBase64)
{
throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
}
public static JSONNode LoadFromStream(Stream aData)
{
using (BinaryReader aReader = new BinaryReader(aData))
{
return Deserialize(aReader);
}
}
public static JSONNode LoadFromFile(string aFileName)
{
using (FileStream aData = File.OpenRead(aFileName))
{
return LoadFromStream(aData);
}
}
public static JSONNode LoadFromBase64(string aBase64)
{
byte[] buffer = Convert.FromBase64String(aBase64);
MemoryStream memoryStream = new MemoryStream(buffer);
memoryStream.Position = 0L;
return LoadFromStream(memoryStream);
}
}
}