init lserp cs 5.0
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
internal class ArrayJsonParser : JsonParserBase {
|
||||
|
||||
private List<object> list = new List<object>();
|
||||
|
||||
public override Object getResult() {
|
||||
return list;
|
||||
}
|
||||
|
||||
public ArrayJsonParser( CharSource charSrc )
|
||||
: base( charSrc ) {
|
||||
}
|
||||
|
||||
protected override void parse() {
|
||||
|
||||
charSrc.moveToText();
|
||||
if (charSrc.getCurrent() != '[') throw ex( "json array must start with [" );
|
||||
|
||||
charSrc.moveToText();
|
||||
if (charSrc.getCurrent() == ']') return;
|
||||
|
||||
// 回到[
|
||||
charSrc.back();
|
||||
|
||||
parseOne();
|
||||
|
||||
}
|
||||
|
||||
private void parseOne() {
|
||||
|
||||
charSrc.moveToText();
|
||||
|
||||
if (charSrc.getCurrent() == ',') {
|
||||
charSrc.back();
|
||||
list.Add( null );
|
||||
}
|
||||
else {
|
||||
charSrc.back();
|
||||
|
||||
// 将值加入列表
|
||||
Object val = moveAndGetParser().getResult();
|
||||
list.Add( val );
|
||||
}
|
||||
|
||||
// 剩余字符处理
|
||||
charSrc.moveToText();
|
||||
|
||||
char c = charSrc.getCurrent();
|
||||
if (c == ']') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (c != ',') throw ex( "json array must seperated with , " );
|
||||
|
||||
charSrc.moveToText();
|
||||
if (charSrc.getCurrent() == ']') {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
charSrc.back();
|
||||
parseOne();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
internal class CharSource {
|
||||
|
||||
public char[] charList;
|
||||
private int index = -1;
|
||||
|
||||
public String strSrc { get; set; }
|
||||
|
||||
public CharSource( String src ) {
|
||||
this.strSrc = clearComment( src );
|
||||
this.charList = this.strSrc.ToCharArray();
|
||||
}
|
||||
|
||||
private String clearComment( String src ) {
|
||||
if (src == null) return null;
|
||||
String[] arr = src.Split( '\n' );
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (String line in arr) {
|
||||
if (line.Trim().StartsWith( "//" )) continue;
|
||||
sb.Append( line );
|
||||
sb.AppendLine();
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public char getCurrent() {
|
||||
|
||||
return charList[index];
|
||||
}
|
||||
|
||||
public void move() {
|
||||
|
||||
if (index >= charList.Length - 1) return;
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
public void back() {
|
||||
index--;
|
||||
}
|
||||
|
||||
public void moveToText() {
|
||||
|
||||
index++;
|
||||
|
||||
char c = this.getCurrent();
|
||||
if (c == 0 || c > ' ') return;
|
||||
|
||||
moveToText();
|
||||
}
|
||||
|
||||
public Boolean isEnd() {
|
||||
return (index >= charList.Length - 1);
|
||||
}
|
||||
|
||||
public int getIndex() {
|
||||
return this.index;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
internal class InitJsonParser : JsonParserBase {
|
||||
|
||||
private Object _result;
|
||||
|
||||
public InitJsonParser( CharSource charSrc )
|
||||
: base( charSrc ) {
|
||||
}
|
||||
|
||||
protected override void parse() {
|
||||
_result = moveAndGetParser().getResult();
|
||||
}
|
||||
|
||||
public override Object getResult() {
|
||||
return _result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
internal abstract class JsonParserBase {
|
||||
|
||||
protected CharSource charSrc;
|
||||
|
||||
protected abstract void parse();
|
||||
public abstract Object getResult();
|
||||
|
||||
public JsonParserBase() {
|
||||
}
|
||||
|
||||
public JsonParserBase( CharSource charSrc ) {
|
||||
this.charSrc = charSrc;
|
||||
parse();
|
||||
}
|
||||
|
||||
protected JsonParserBase moveAndGetParser() {
|
||||
|
||||
charSrc.moveToText();
|
||||
|
||||
char c = charSrc.getCurrent();
|
||||
|
||||
if (c == '"' || c == '\'') {
|
||||
return new StringJsonParser( this.charSrc, c );
|
||||
}
|
||||
|
||||
if (c == '{') {
|
||||
charSrc.back();
|
||||
return new ObjectJsonParser( this.charSrc );
|
||||
}
|
||||
|
||||
if (c == '[') {
|
||||
charSrc.back();
|
||||
return new ArrayJsonParser( this.charSrc );
|
||||
}
|
||||
|
||||
return new ValueJsonParser( this.charSrc );
|
||||
|
||||
}
|
||||
|
||||
protected JsonParserException ex( String msg ) {
|
||||
return new JsonParserException( msg + "(index:"+this.charSrc.getIndex().ToString()+")\n" + this.charSrc.strSrc );
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
internal class JsonParserException : Exception {
|
||||
|
||||
private String msg;
|
||||
|
||||
public JsonParserException() {
|
||||
}
|
||||
|
||||
public JsonParserException( String msg ) {
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public JsonParserException( String msg, Exception inner )
|
||||
: base( msg, inner ) {
|
||||
}
|
||||
|
||||
public override String Message {
|
||||
get {
|
||||
return base.Message + Environment.NewLine + this.msg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override String ToString() {
|
||||
return base.ToString() + Environment.NewLine + this.msg;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
|
||||
internal class ObjectJsonParser : JsonParserBase {
|
||||
|
||||
private Dictionary<String, object> map = new Dictionary<String, object>();
|
||||
|
||||
public override Object getResult() {
|
||||
return this.map;
|
||||
}
|
||||
|
||||
public ObjectJsonParser( CharSource charSrc )
|
||||
: base( charSrc ) {
|
||||
}
|
||||
|
||||
protected override void parse() {
|
||||
|
||||
charSrc.moveToText();
|
||||
|
||||
if (charSrc.getCurrent() != '{') throw ex( "json Object must start with { " );
|
||||
|
||||
|
||||
charSrc.moveToText();
|
||||
if (charSrc.getCurrent() == '}') return;
|
||||
charSrc.back();
|
||||
|
||||
parseOne();
|
||||
|
||||
}
|
||||
|
||||
private void parseOne() {
|
||||
|
||||
|
||||
charSrc.moveToText();
|
||||
|
||||
if (charSrc.getCurrent() == '}') return;
|
||||
|
||||
// 解析key
|
||||
charSrc.back();
|
||||
String key = moveAndGetParser().getResult().ToString();
|
||||
|
||||
// 解析冒号
|
||||
charSrc.moveToText();
|
||||
if (charSrc.getCurrent() != ':') throw ex( "json object's property pair must seperated with :" );
|
||||
|
||||
// 解析value
|
||||
Object val = moveAndGetParser().getResult();
|
||||
|
||||
// 获取值
|
||||
map.Add( key, val );
|
||||
|
||||
// 处理剩下的字符
|
||||
charSrc.moveToText();
|
||||
char c = charSrc.getCurrent();
|
||||
if (c == '}') return;
|
||||
if (c != ',') throw ex( "json object's property must seperated with ," );
|
||||
|
||||
charSrc.moveToText();
|
||||
if (charSrc.getCurrent() == '}')
|
||||
return;
|
||||
else {
|
||||
charSrc.back();
|
||||
parseOne();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
internal class StringJsonParser : ValueJsonParser {
|
||||
|
||||
private String _result;
|
||||
|
||||
public override Object getResult() {
|
||||
return _result;
|
||||
}
|
||||
|
||||
|
||||
public StringJsonParser( CharSource charSrc, char c ) {
|
||||
this.quote = c;
|
||||
this.charSrc = charSrc;
|
||||
parse();
|
||||
}
|
||||
|
||||
private char quote = '"';
|
||||
|
||||
|
||||
protected override void parse() {
|
||||
|
||||
charSrc.move();
|
||||
|
||||
char c = charSrc.getCurrent();
|
||||
|
||||
if (c == '\n' || c == '\r') throw ex( "String ends at a new line while not end" );
|
||||
|
||||
if (c == quote) {
|
||||
_result = sb.ToString();
|
||||
return;
|
||||
}
|
||||
|
||||
if (c == '\\')
|
||||
processEscape();
|
||||
else
|
||||
sb.Append( c );
|
||||
|
||||
parse();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Zhaizj.Framework.Serialization {
|
||||
|
||||
internal class ValueJsonParser : JsonParserBase {
|
||||
|
||||
protected StringBuilder sb = new StringBuilder();
|
||||
private static readonly String separatorChars = ",\":[]{}";
|
||||
|
||||
private Object _result;
|
||||
|
||||
public override Object getResult() {
|
||||
return _result;
|
||||
}
|
||||
|
||||
public ValueJsonParser() {
|
||||
}
|
||||
|
||||
public ValueJsonParser( CharSource charSrc )
|
||||
: base( charSrc ) {
|
||||
}
|
||||
|
||||
protected override void parse() {
|
||||
|
||||
paserOne();
|
||||
|
||||
charSrc.back();
|
||||
|
||||
String s = sb.ToString().Trim();
|
||||
if (s.Equals( "" )) throw ex( "value is empty" );
|
||||
|
||||
|
||||
_result = getStringValue( s );
|
||||
}
|
||||
|
||||
|
||||
private void paserOne() {
|
||||
|
||||
char c = charSrc.getCurrent();
|
||||
|
||||
if (c >= ' ' && separatorChars.IndexOf( c ) < 0) {
|
||||
|
||||
if (c == '\\') {
|
||||
processEscape();
|
||||
}
|
||||
else
|
||||
sb.Append( c );
|
||||
|
||||
if (charSrc.isEnd()) return;
|
||||
|
||||
charSrc.move();
|
||||
|
||||
paserOne();
|
||||
}
|
||||
}
|
||||
|
||||
protected void processEscape() {
|
||||
|
||||
charSrc.move();
|
||||
|
||||
char c = charSrc.getCurrent();
|
||||
|
||||
if (c == 'b')
|
||||
sb.Append( '\b' );
|
||||
else if (c == 't')
|
||||
sb.Append( '\t' );
|
||||
else if (c == 'n')
|
||||
sb.Append( '\n' );
|
||||
else if (c == 'n')
|
||||
sb.Append( '\n' );
|
||||
else if (c == 'r')
|
||||
sb.Append( '\r' );
|
||||
else if (c == 'u') {
|
||||
//sb.Append( '' ); // TODO
|
||||
}
|
||||
else if (c == '"' || c == '\'' || c == '/' || c == '\\')
|
||||
sb.Append( c );
|
||||
else
|
||||
throw ex( "not a valid escape character" );
|
||||
}
|
||||
|
||||
private static Object getStringValue( String s ) {
|
||||
|
||||
if (cvt.IsInt( s )) return cvt.ToInt( s );
|
||||
if (cvt.IsDecimal( s )) return cvt.ToDecimal( s );
|
||||
if (cvt.IsBool( s )) return cvt.ToBool( s );
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user