public ParseException(string msg, Reader reader) : base(msg) { this.JsonString = reader.JsonString; this.CharAt = reader.At; this.LineAt = reader.LineAt; this.ColumnAt = reader.ColumnAt; }
public JToken Parse(string jsonString, int at = 0) { var reader = new Reader(jsonString, at); JArray targetArr = null; JToken result = null; JObject targetObj = null; var stack = new Stack<JToken>(); reader.OnObjectStart = (name,colAt,lineAt) => { if (result == null) { result = targetObj = new JObject(); } else { var newTarget = new JObject(); if (targetObj != null) { targetObj[name] = newTarget; stack.Push(targetObj); } else if (targetArr != null && name == null) { targetArr.Push(newTarget); stack.Push(targetArr); } targetObj = newTarget; targetArr = null; } }; reader.OnArrayStart = (name) => { if (result == null) { result = targetArr = new JArray(); } else { var newTarget = new JArray(); if (targetObj != null) { targetObj[name] = newTarget; stack.Push(targetObj); } else if (targetArr != null && name == null) { targetArr.Push(newTarget); stack.Push(targetArr); } targetArr = newTarget; targetObj = null; } }; reader.OnObjectEnd = () => { if (targetObj != result && targetArr != result) { var target = stack.Pop(); if ((targetArr = target as JArray) == null) { if ((targetObj = target as JObject) == null) { throw new ParseException("不期望的}", reader.JsonString, reader.At, reader.LineAt, reader.ColumnAt); } } else targetObj = null; } return true; }; reader.OnArrayEnd = () => { if (targetObj != result && targetArr != result) { var target = stack.Pop(); if ((targetArr = target as JArray) == null) { if ((targetObj = target as JObject) == null) { throw new ParseException("不期望的]", reader.JsonString, reader.At, reader.LineAt, reader.ColumnAt); } } else targetObj = null; } return true; }; reader.OnFunctionFound = (name, value) => { if (targetObj != null) targetObj[name] = new JFunction(value); else if (targetArr != null) targetArr.Push(new JFunction(value)); else if (name == null) result = new JFunction(value); else { result = targetObj = new JObject(); targetObj[name] = new JFunction(value); } return true; }; reader.OnKeyValueFound = (name, valueString) => { JToken value = ParseValueString(valueString); if (targetObj != null) targetObj[name] = value; else if (targetArr != null) targetArr.Push(value); else if (name == null) result = value; else { result = targetObj = new JObject(); targetObj[name] = value; } return true; }; reader.Read(); return result; }