private static KeyValuePair <String, JToken> GetNextProperty(string json, int start, out int endIndex) { int indexPointer; int endPropName; var name = GetNextPropertyName(json, start, out endPropName); indexPointer = endPropName; if (!json.TryNextChar(indexPointer, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } int nextCharIndex; var nextChar = json.FindCharNotIsSpaceFollowByIndex(indexPointer, out nextCharIndex); if (nextCharIndex == -1 || !':'.Equals(nextChar)) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } indexPointer = nextCharIndex; if (!json.TryNextChar(indexPointer, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } var propValue = JToken.Parse(json, indexPointer, out endIndex); return(new KeyValuePair <string, JToken>(name, propValue)); }
public string MoveBehindStringAndGet() { var stringMark = CurrentChar; if (!IsStartOfString()) { throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex); } Move(); int endStringIndex = 0; for (int i = currentIndex; i < json.Length; i++) { var c = json[i]; if ('\\'.Equals(c)) { i++; continue; } if (stringMark.Equals(c)) { endStringIndex = i; break; } } if (endStringIndex == 0) { throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex); } var stringLength = endStringIndex - currentIndex; var content = json.Substring(currentIndex, stringLength); Move(stringLength + 1); return(content); }
private int FindNumberLength() { int length = 0; bool hasDot = false; for (int i = currentIndex; i < json.Length; i++) { var c = json[i]; if ('.'.Equals(c)) { if (hasDot) { throw ExceptionHelpers.MakeJsonErrorException(json, i); } hasDot = true; length++; } else if ('0' <= c && '9' >= c) { length++; } else { break; } } return(length); }
//public new static JObject Parse(string json) //{ // var l_json = json.TrimStart().TrimEnd(); // if (!json.StartsWith("{") || !json.EndsWith("}")) // throw new Exception("can not parse json from string: " + json); // var propJson = l_json.Substring(1, l_json.Length - 2); // var result = new JObject(); // return result; //} internal new static JObject Parse(string json, int start, out int endIndex) { var result = new JObject(); endIndex = start; int indexPointer = start; if (!json.TryNextChar(indexPointer, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, start); } while (true) { int endJObject; if (IsEndObject(json, indexPointer, out endJObject)) { indexPointer = endJObject; break; } int endProperty; var prop = GetNextProperty(json, indexPointer, out endProperty); result.Add(prop); indexPointer = endProperty; if (!json.TryNextChar(indexPointer, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } int nextCharIndex; var nextChar = json.FindCharNotIsSpaceFollowByIndex(indexPointer, out nextCharIndex); if (nextCharIndex == -1) { throw ExceptionHelpers.MakeJsonErrorException(json, endProperty); } indexPointer = nextCharIndex; if (','.Equals(nextChar)) { if (!json.TryNextChar(indexPointer, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } } else { if (IsEndObject(json, indexPointer, out endJObject)) { indexPointer = endJObject; break; } throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } } endIndex = indexPointer; return(result); }
public void Move(int step) { if (currentIndex + step >= json.Length) { throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex); } currentIndex += step; }
internal new static JObject Parse(JsonStream jsonStream) { jsonStream.MoveToNextContent(); if (!'{'.Equals(jsonStream.CurrentChar)) { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } List <KeyValuePair <string, JToken> > properties = new List <KeyValuePair <string, JToken> >(); jsonStream.Move(); jsonStream.MoveToNextContent(); if (jsonStream.IsStartOfString()) { while (true) { var prop = GetNextProperty(jsonStream); properties.Add(prop); jsonStream.MoveToNextContent(); if (','.Equals(jsonStream.CurrentChar)) { jsonStream.Move(); jsonStream.MoveToNextContent(); if (jsonStream.IsStartOfString()) { continue; } else if ('}'.Equals(jsonStream.CurrentChar)) { break; } else { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } } else if ('}'.Equals(jsonStream.CurrentChar)) { break; } else { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } } } else if (!'}'.Equals(jsonStream.CurrentChar)) { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } jsonStream.Move(); var answer = new JObject(); answer.m_items = new Dictionary <string, JToken>(properties); return(answer); }
//public new static JArray Parse(string json) //{ // var result = new JArray(); // return result; //} internal new static JArray Parse(string json, int start, out int endIndex) { endIndex = start; int indexPointer; if (!json.TryNextChar(start, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, start); } List <JToken> items = new List <JToken>(); while (true) { int endArrayIndex; if (IsEndArray(json, indexPointer, out endArrayIndex)) { indexPointer = endArrayIndex; break; } int nextObjEndIndex; var nextObj = JToken.Parse(json, indexPointer, out nextObjEndIndex); indexPointer = nextObjEndIndex; items.Add(nextObj); if (!json.TryNextChar(indexPointer, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } int nextCharIndex; var nextChar = json.FindCharNotIsSpaceFollowByIndex(indexPointer, out nextCharIndex); if (nextCharIndex == -1) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } indexPointer = nextCharIndex; if (','.Equals(nextChar)) { if (!json.TryNextChar(indexPointer, out indexPointer)) { throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } } else { if (IsEndArray(json, indexPointer, out endArrayIndex)) { indexPointer = endArrayIndex; break; } throw ExceptionHelpers.MakeJsonErrorException(json, indexPointer); } } endIndex = indexPointer; return(new JArray(items.ToArray())); }
public static JToken ParseNew(string json) { var jsonStream = new JsonStream(json); var answer = Parse(jsonStream); if (jsonStream.HasNextContent()) { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } return(answer); }
public char MoveToNextContent() { for (int i = currentIndex; i < json.Length; i++) { if (IsContentChar(json[i])) { currentIndex = i; return(json[i]); } } throw ExceptionHelpers.MakeJsonErrorException(json, currentIndex); }
private static KeyValuePair <String, JToken> GetNextProperty(JsonStream jsonStream) { var propName = jsonStream.MoveBehindStringAndGet(); jsonStream.MoveToNextContent(); if (!':'.Equals(jsonStream.CurrentChar)) { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } jsonStream.Move(); var propValue = JToken.Parse(jsonStream); return(new KeyValuePair <string, JToken>(propName, propValue)); }
public static JToken Parse(string json) { int endIndex; var answer = Parse(json, 0, out endIndex); if (json.TryNextChar(endIndex, out endIndex)) { int nextCharIndex; var nextChar = json.FindCharNotIsSpaceFollowByIndex(endIndex, out nextCharIndex); if (nextCharIndex != -1) { throw ExceptionHelpers.MakeJsonErrorException(json, nextCharIndex); } } return(answer); }
internal new static JArray Parse(JsonStream jsonStream) { jsonStream.MoveToNextContent(); if (!'['.Equals(jsonStream.CurrentChar)) { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } jsonStream.Move(); jsonStream.MoveToNextContent(); List <JToken> values = new List <JToken>(); if (!']'.Equals(jsonStream.CurrentChar)) { while (true) { var value = JToken.Parse(jsonStream); values.Add(value); jsonStream.MoveToNextContent(); if (','.Equals(jsonStream.CurrentChar)) { jsonStream.Move(); jsonStream.MoveToNextContent(); if (']'.Equals(jsonStream.CurrentChar)) { break; } } else if (']'.Equals(jsonStream.CurrentChar)) { break; } } } jsonStream.Move(); var answer = new JArray(values); return(answer); }
private static string GetNextPropertyName(string json, int start, out int endIndex) { for (int i = start; i < json.Length; i++) { var c = json[i]; if (' '.Equals(c)) { continue; } else if ('"'.Equals(c) || '\''.Equals(c)) { var index = json.FindNextCharIndexFromIndex(c, i + 1); var name = json.Substring(i + 1, index - i - 1); endIndex = index; return(name); } else { throw ExceptionHelpers.MakeJsonErrorException(json, i); } } throw ExceptionHelpers.MakeJsonErrorException(json, start); }
internal static JToken Parse(string json, int start, out int endIndex) { JToken answer = null; endIndex = start; for (int i = start; i < json.Length; i++) { if (' '.Equals(json[i])) { continue; } var c = json[i]; if ('{'.Equals(c)) { answer = JObject.Parse(json, i, out endIndex); break; } else if ('['.Equals(c)) { answer = JArray.Parse(json, i, out endIndex); break; } else if ('"'.Equals(c) || '\''.Equals(c)) { var nextIndex = json.FindNextCharIndexFromIndex(c, i + 1); if (nextIndex == -1) { throw ExceptionHelpers.MakeJsonErrorException(json, i); } var content = json.Substring(i + 1, nextIndex - i - 1); answer = (JToken)content; endIndex = nextIndex; break; } else if ('.'.Equals(c) || (c >= '0' && c <= '9')) { var number = json.FindNumberFollowByIndex(i); endIndex = i + number.Length - 1; answer = (JToken)double.Parse(number); break; } else if (json.HasStringFollowByIndex("null", i)) { answer = new JValue(null); endIndex = i + 3; break; } else if (json.HasStringFollowByIndex("true", i)) { answer = (JToken)true; endIndex = i + 3; break; } else if (json.HasStringFollowByIndex("false", i)) { answer = (JToken)false; endIndex = i + 4; break; } else { throw ExceptionHelpers.MakeJsonErrorException(json, i); } } return(answer); }
internal new static JValue Parse(JsonStream jsonStream) { JValue answer; switch (jsonStream.CurrentChar) { case 'n': if (jsonStream.HasNullFollow()) { answer = new JValue(null); jsonStream.MoveBehindNull(); } else { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } break; case 't': if (jsonStream.HasTrueFollow()) { answer = (JValue)true; jsonStream.MoveBehindTrue(); } else { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } break; case 'f': if (jsonStream.HasFalseFollow()) { answer = (JValue)false; jsonStream.MoveBehindFalse(); } else { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } break; default: if (jsonStream.IsStartOfString()) { var content = jsonStream.MoveBehindStringAndGet(); answer = (JValue)content; } else if (jsonStream.IsStartOfNumber()) { var number = jsonStream.MoveBehindNumberAndGet(); answer = (JValue)double.Parse(number); } else { throw ExceptionHelpers.MakeJsonErrorException(jsonStream); } break; } return(answer); }