in Scripts/Runtime/Lib/WitResponse.cs [308:487]
public static WitResponseNode Parse(string aJSON)
{
Stack<WitResponseNode> stack = new Stack<WitResponseNode>();
WitResponseNode ctx = null;
int i = 0;
string Token = "";
string TokenName = "";
bool QuoteMode = false;
while (i < aJSON.Length)
{
switch (aJSON[i])
{
case '{':
if (QuoteMode)
{
Token += aJSON[i];
break;
}
stack.Push(new WitResponseClass());
if (ctx != null)
{
TokenName = TokenName.Trim();
if (ctx is WitResponseArray)
ctx.Add(stack.Peek());
else if (TokenName != "")
ctx.Add(TokenName, stack.Peek());
}
TokenName = "";
Token = "";
ctx = stack.Peek();
break;
case '[':
if (QuoteMode)
{
Token += aJSON[i];
break;
}
stack.Push(new WitResponseArray());
if (ctx != null)
{
TokenName = TokenName.Trim();
if (ctx is WitResponseArray)
ctx.Add(stack.Peek());
else if (TokenName != "")
ctx.Add(TokenName, stack.Peek());
}
TokenName = "";
Token = "";
ctx = stack.Peek();
break;
case '}':
case ']':
if (QuoteMode)
{
Token += aJSON[i];
break;
}
if (stack.Count == 0)
throw new JSONParseException("JSON Parse: Too many closing brackets");
stack.Pop();
if (Token != "")
{
TokenName = TokenName.Trim();
if (ctx is WitResponseArray)
ctx.Add(Token);
else if (TokenName != "")
ctx.Add(TokenName, Token);
}
TokenName = "";
Token = "";
if (stack.Count > 0)
ctx = stack.Peek();
break;
case ':':
if (QuoteMode)
{
Token += aJSON[i];
break;
}
TokenName = Token;
Token = "";
break;
case '"':
QuoteMode ^= true;
break;
case ',':
if (QuoteMode)
{
Token += aJSON[i];
break;
}
if (Token != "")
{
if (ctx is WitResponseArray)
ctx.Add(Token);
else if (TokenName != "")
ctx.Add(TokenName, Token);
}
TokenName = "";
Token = "";
break;
case '\r':
case '\n':
break;
case ' ':
case '\t':
if (QuoteMode)
Token += aJSON[i];
break;
case '\\':
++i;
if (QuoteMode)
{
char C = aJSON[i];
switch (C)
{
case 't':
Token += '\t';
break;
case 'r':
Token += '\r';
break;
case 'n':
Token += '\n';
break;
case 'b':
Token += '\b';
break;
case 'f':
Token += '\f';
break;
case 'u':
{
string s = aJSON.Substring(i + 1, 4);
Token += (char) int.Parse(s,
System.Globalization.NumberStyles.AllowHexSpecifier);
i += 4;
break;
}
default:
Token += C;
break;
}
}
break;
default:
Token += aJSON[i];
break;
}
++i;
}
if (QuoteMode)
{
throw new JSONParseException("JSON Parse: Quotation marks seems to be messed up.");
}
return ctx;
}