You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PlumberUltimateAds/Assets/Scripts/SimpleJSON/JSONNode.cs

561 lines
10 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
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<JSONNode> Childs
{
get
{
yield break;
}
}
public IEnumerable<JSONNode> 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<JSONNode> stack = new Stack<JSONNode>();
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);
}
}
}