96 lines
2.2 KiB
C#
96 lines
2.2 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
|
|
}
|