using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Data;
|
using System.Linq;
|
using System.Reflection;
|
using System.Text;
|
using System.Text.RegularExpressions;
|
using System.Threading.Tasks;
|
using System.Web;
|
using WIDESEA_Core.Const;
|
using WIDESEA_Core.Enums;
|
|
namespace WIDESEA_Core.Helper
|
{
|
public static class UtilConvert
|
{
|
private static DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);
|
|
private static long longTime = 621355968000000000;
|
|
private static int samllTime = 10000000;
|
/// <summary>
|
/// 时间戳转换成日期
|
/// </summary>
|
/// <param name="timeStamp"></param>
|
/// <returns></returns>
|
public static DateTime GetTimeSpmpToDate(this object timeStamp)
|
{
|
if (timeStamp == null) return dateStart;
|
DateTime dateTime = new DateTime(longTime + Convert.ToInt64(timeStamp) * samllTime, DateTimeKind.Utc).ToLocalTime();
|
return dateTime;
|
}
|
|
public static string Serialize(this object obj, JsonSerializerSettings formatDate = null)
|
{
|
if (obj == null) return null;
|
formatDate = formatDate ?? new JsonSerializerSettings
|
{
|
DateFormatString = "yyyy-MM-dd HH:mm:ss"
|
};
|
return JsonConvert.SerializeObject(obj, formatDate);
|
}
|
|
public static T DeserializeObject<T>(this string json)
|
{
|
if (string.IsNullOrEmpty(json))
|
{
|
return default(T);
|
}
|
if (json == "{}")
|
{
|
json = "[]";
|
}
|
return JsonConvert.DeserializeObject<T>(json);
|
}
|
|
public static string FirstLetterToLower(this string thisValue)
|
{
|
if (string.IsNullOrEmpty(thisValue)) return string.Empty;
|
string result = thisValue.Substring(0, 1).ToLower() + thisValue.Substring(1, thisValue.Length - 1);
|
return result;
|
}
|
|
public static string FirstLetterToUpper(this string thisValue)
|
{
|
if (string.IsNullOrEmpty(thisValue)) return string.Empty;
|
string result = thisValue.Substring(0, 1).ToUpper() + thisValue.Substring(1, thisValue.Length - 1);
|
return result;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static int ObjToInt(this object thisValue)
|
{
|
int reval = 0;
|
if (thisValue == null) return 0;
|
if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return reval;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static int DoubleToInt(this double thisValue)
|
{
|
int reval = 0;
|
|
return Convert.ToInt32(thisValue);
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <param name="errorValue"></param>
|
/// <returns></returns>
|
public static int ObjToInt(this object thisValue, int errorValue)
|
{
|
int reval = 0;
|
if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return errorValue;
|
}
|
|
public static long ObjToLong(this object thisValue)
|
{
|
long reval = 0;
|
if (thisValue == null) return 0;
|
if (thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return reval;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static double ObjToMoney(this object thisValue)
|
{
|
double reval = 0;
|
if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return 0;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <param name="errorValue"></param>
|
/// <returns></returns>
|
public static double ObjToMoney(this object thisValue, double errorValue)
|
{
|
double reval = 0;
|
if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return errorValue;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static string ObjToString(this object thisValue)
|
{
|
if (thisValue != null) return thisValue.ToString().Trim();
|
return "";
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static bool IsNotEmptyOrNull(this object thisValue)
|
{
|
return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null";
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <param name="errorValue"></param>
|
/// <returns></returns>
|
public static string ObjToString(this object thisValue, string errorValue)
|
{
|
if (thisValue != null) return thisValue.ToString().Trim();
|
return errorValue;
|
}
|
|
public static bool IsNullOrEmpty(this object thisValue) => thisValue == null || thisValue == DBNull.Value || string.IsNullOrWhiteSpace(thisValue.ToString());
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static Decimal ObjToDecimal(this object thisValue)
|
{
|
Decimal reval = 0;
|
if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return 0;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <param name="errorValue"></param>
|
/// <returns></returns>
|
public static Decimal ObjToDecimal(this object thisValue, decimal errorValue)
|
{
|
Decimal reval = 0;
|
if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return errorValue;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static DateTime ObjToDate(this object thisValue)
|
{
|
DateTime reval = DateTime.MinValue;
|
if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
|
{
|
reval = Convert.ToDateTime(thisValue);
|
}
|
|
return reval;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <param name="errorValue"></param>
|
/// <returns></returns>
|
public static DateTime ObjToDate(this object thisValue, DateTime errorValue)
|
{
|
DateTime reval = DateTime.MinValue;
|
if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return errorValue;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static bool ObjToBool(this object thisValue)
|
{
|
bool reval = false;
|
if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval))
|
{
|
return reval;
|
}
|
|
return reval;
|
}
|
|
|
/// <summary>
|
/// 获取当前时间的时间戳
|
/// </summary>
|
/// <param name="thisValue"></param>
|
/// <returns></returns>
|
public static string DateToTimeStamp(this DateTime thisValue)
|
{
|
TimeSpan ts = thisValue - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
return Convert.ToInt64(ts.TotalSeconds).ToString();
|
}
|
|
public static object ChangeType(this object value, Type type)
|
{
|
if (value == null && type.IsGenericType) return Activator.CreateInstance(type);
|
if (value == null) return null;
|
if (type == value.GetType()) return value;
|
if (type.IsEnum)
|
{
|
if (value is string)
|
return Enum.Parse(type, value as string);
|
else
|
return Enum.ToObject(type, value);
|
}
|
|
if (!type.IsInterface && type.IsGenericType)
|
{
|
Type innerType = type.GetGenericArguments()[0];
|
object innerValue = ChangeType(value, innerType);
|
return Activator.CreateInstance(type, new object[] { innerValue });
|
}
|
|
if (value is string && type == typeof(Guid)) return new Guid(value as string);
|
if (value is string && type == typeof(Version)) return new Version(value as string);
|
if (!(value is IConvertible)) return value;
|
return Convert.ChangeType(value, type);
|
}
|
|
public static object ChangeTypeList(this object value, Type type)
|
{
|
if (value == null) return default;
|
|
var gt = typeof(List<>).MakeGenericType(type);
|
dynamic lis = Activator.CreateInstance(gt);
|
|
var addMethod = gt.GetMethod("Add");
|
string values = value.ToString();
|
if (values != null && values.StartsWith("(") && values.EndsWith(")"))
|
{
|
string[] splits;
|
if (values.Contains("\",\""))
|
{
|
splits = values.Remove(values.Length - 2, 2)
|
.Remove(0, 2)
|
.Split("\",\"");
|
}
|
else
|
{
|
splits = values.Remove(0, 1)
|
.Remove(values.Length - 2, 1)
|
.Split(",");
|
}
|
|
foreach (var split in splits)
|
{
|
var str = split;
|
if (split.StartsWith("\"") && split.EndsWith("\""))
|
{
|
str = split.Remove(0, 1)
|
.Remove(split.Length - 2, 1);
|
}
|
|
addMethod.Invoke(lis, new object[] { ChangeType(str, type) });
|
}
|
}
|
|
return lis;
|
}
|
|
public static string ToJson(this object value)
|
{
|
return JsonConvert.SerializeObject(value);
|
}
|
|
public static bool IsInt(this object obj)
|
{
|
if (obj == null)
|
return false;
|
bool reslut = Int32.TryParse(obj.ToString(), out int _number);
|
return reslut;
|
|
}
|
public static bool IsDate(this object str)
|
{
|
return str.IsDate(out _);
|
}
|
public static bool IsDate(this object str, out DateTime dateTime)
|
{
|
dateTime = DateTime.Now;
|
if (str == null || str.ToString() == "")
|
{
|
return false;
|
}
|
return DateTime.TryParse(str.ToString(), out dateTime);
|
}
|
|
/// <summary>
|
/// 根据传入格式判断是否为小数
|
/// </summary>
|
/// <param name="str"></param>
|
/// <param name="formatString">18,5</param>
|
/// <returns></returns>
|
public static bool IsNumber(this string str, string formatString)
|
{
|
if (string.IsNullOrEmpty(str)) return false;
|
|
return Regex.IsMatch(str, @"^[+-]?\d*[.]?\d*$");
|
}
|
|
public static bool IsGuid(this string guid)
|
{
|
Guid newId;
|
return guid.GetGuid(out newId);
|
}
|
|
public static bool GetGuid(this string guid, out Guid outId)
|
{
|
Guid emptyId = Guid.Empty;
|
return Guid.TryParse(guid, out outId);
|
}
|
|
/// <summary>
|
/// 转换为短整型 qy 2024-7-15
|
/// </summary>
|
/// <param name="data">数据</param>
|
public static short ToShort(this object data)
|
{
|
if (data == null)
|
return 0;
|
short result;
|
var success = short.TryParse(data.ToString(), out result);
|
if (success)
|
return result;
|
try
|
{
|
return Convert.ToInt16(data);
|
}
|
catch (Exception)
|
{
|
return 0;
|
}
|
}
|
|
/// <summary>
|
/// 转换为高精度浮点数,并按指定的小数位4舍5入 qy 2024-7-15
|
/// </summary>
|
/// <param name="data">数据</param>
|
/// <param name="digits">小数位数</param>
|
public static decimal ToDecimal(this object data, int digits)
|
{
|
return Math.Round(ObjToDecimal(data), digits);
|
}
|
|
|
|
/// <summary>
|
/// 枚举转List qy 2024-7-15
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <returns></returns>
|
public static List<object> GetEnumList<T>()
|
{
|
List<object> list = new List<object>();
|
var t = typeof(T);
|
foreach (var item in Enum.GetValues(typeof(T)))
|
{
|
FieldInfo f = t.GetField(Enum.GetName(typeof(T), item));
|
var r = (System.ComponentModel.DescriptionAttribute[])f.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
|
list.Add(new { ID = item, value = Enum.GetName(typeof(T), item), name = r[0].Description });
|
}
|
return list;
|
}
|
|
/// <summary>
|
/// 验证动态类型元素是否为空 qy 2024-7-15
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
public static bool CheckDynamic(object obj)
|
{
|
return (obj != null && Convert.ToString(obj) != "") ? true : false;
|
}
|
|
/// <summary>
|
/// 动态类型元素转字符串并解码 qy 2024-7-15
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
public static string DynamicToString(object obj)
|
{
|
return CheckDynamic(obj) ? HttpUtility.UrlDecode(Convert.ToString(obj).Trim()) : "";
|
}
|
|
/// <summary>
|
/// DataTable转为json qy 2024-7-15
|
/// </summary>
|
/// <param name="parObjRefDataTable">DataTable</param>
|
/// <returns>json数据</returns>
|
public static string ToJson(this DataTable parObjRefDataTable)
|
{
|
List<object> objArrList = new List<object>();
|
|
foreach (DataRow objDataRow in parObjRefDataTable.Rows)
|
{
|
Dictionary<string, object> objResult = new Dictionary<string, object>();
|
|
foreach (DataColumn objDataColumn in parObjRefDataTable.Columns)
|
objResult.Add(objDataColumn.ColumnName, objDataRow[objDataColumn].ToString());
|
|
objArrList.Add(objResult);
|
}
|
|
return ToJson(objArrList);
|
}
|
/// <summary>
|
/// Json转List qy 2024-7-15
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="parJson"></param>
|
/// <returns></returns>
|
public static List<T> JsonToList<T>(this string parJson)
|
{
|
if (string.IsNullOrWhiteSpace(parJson))
|
{
|
return new List<T>();
|
}
|
else
|
{
|
return JsonConvert.DeserializeObject<List<T>>(parJson);
|
}
|
}
|
|
/// <summary>
|
/// 日期转为unix值
|
/// </summary>
|
/// <param name="dt"></param>
|
/// <param name="utc">T:按UTC时间计算(默认);F:按本地时间计算</param>
|
/// <returns></returns>
|
public static double ToUnix(this DateTime dt, bool utc = true)
|
{
|
double intResult = 0;
|
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
|
intResult = (dt - startTime).TotalSeconds;
|
intResult = Math.Round(intResult, 0);
|
return intResult;
|
}
|
|
#region 判断是否为字符串 qy 2024-7-15
|
/// <summary>
|
/// 判断字符串是否为合法的json字符串 qy 2024-7-15
|
/// </summary>
|
/// <param name="json"></param>
|
/// <returns></returns>
|
public static bool IsJson(string json)
|
{
|
int errIndex;
|
return IsJson(json, out errIndex);
|
}
|
public static bool IsJson(string json, out int errIndex)
|
{
|
errIndex = 0;
|
if (IsJsonStart(ref json))
|
{
|
CharState cs = new CharState();
|
char c;
|
for (int i = 0; i < json.Length; i++)
|
{
|
c = json[i];
|
if (SetCharState(c, ref cs) && cs.childrenStart)//设置关键符号状态。
|
{
|
string item = json.Substring(i);
|
int err;
|
int length = GetValueLength(item, true, out err);
|
cs.childrenStart = false;
|
if (err > 0)
|
{
|
errIndex = i + err;
|
return false;
|
}
|
i = i + length - 1;
|
}
|
if (cs.isError)
|
{
|
errIndex = i;
|
return false;
|
}
|
}
|
|
return !cs.arrayStart && !cs.jsonStart;
|
}
|
return false;
|
}
|
|
private static bool IsJsonStart(ref string json)
|
{
|
if (!string.IsNullOrEmpty(json))
|
{
|
json = json.Trim('\r', '\n', ' ');
|
if (json.Length > 1)
|
{
|
char s = json[0];
|
char e = json[json.Length - 1];
|
return (s == '{' && e == '}') || (s == '[' && e == ']');
|
}
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 获取值的长度(当Json值嵌套以"{"或"["开头时) qy 2024-7-15
|
/// </summary>
|
private static int GetValueLength(string json, bool breakOnErr, out int errIndex)
|
{
|
errIndex = 0;
|
int len = 0;
|
if (!string.IsNullOrEmpty(json))
|
{
|
CharState cs = new CharState();
|
char c;
|
for (int i = 0; i < json.Length; i++)
|
{
|
c = json[i];
|
if (!SetCharState(c, ref cs))//设置关键符号状态。
|
{
|
if (!cs.jsonStart && !cs.arrayStart)//json结束,又不是数组,则退出。
|
{
|
break;
|
}
|
}
|
else if (cs.childrenStart)//正常字符,值状态下。
|
{
|
int length = GetValueLength(json.Substring(i), breakOnErr, out errIndex);//递归子值,返回一个长度。。。
|
cs.childrenStart = false;
|
cs.valueStart = 0;
|
//cs.state = 0;
|
i = i + length - 1;
|
}
|
if (breakOnErr && cs.isError)
|
{
|
errIndex = i;
|
return i;
|
}
|
if (!cs.jsonStart && !cs.arrayStart)//记录当前结束位置。
|
{
|
len = i + 1;//长度比索引+1
|
break;
|
}
|
}
|
}
|
return len;
|
}
|
|
/// <summary>
|
/// 字符状态 qy 2024-7-15
|
/// </summary>
|
private class CharState
|
{
|
internal bool jsonStart = false;//以 "{"开始了...
|
internal bool setDicValue = false;// 可以设置字典值了。
|
internal bool escapeChar = false;//以"\"转义符号开始了
|
/// <summary>
|
/// 数组开始【仅第一开头才算】,值嵌套的以【childrenStart】来标识。
|
/// </summary>
|
internal bool arrayStart = false;//以"[" 符号开始了
|
internal bool childrenStart = false;//子级嵌套开始了。
|
/// <summary>
|
/// 【0 初始状态,或 遇到“,”逗号】;【1 遇到“:”冒号】
|
/// </summary>
|
internal int state = 0;
|
|
/// <summary>
|
/// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】
|
/// </summary>
|
internal int keyStart = 0;
|
/// <summary>
|
/// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】
|
/// </summary>
|
internal int valueStart = 0;
|
internal bool isError = false;//是否语法错误。
|
|
internal void CheckIsError(char c)//只当成一级处理(因为GetLength会递归到每一个子项处理)
|
{
|
if (keyStart > 1 || valueStart > 1)
|
{
|
return;
|
}
|
//示例 ["aa",{"bbbb":123,"fff","ddd"}]
|
switch (c)
|
{
|
case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]
|
isError = jsonStart && state == 0;//重复开始错误 同时不是值处理。
|
break;
|
case '}':
|
isError = !jsonStart || (keyStart != 0 && state == 0);//重复结束错误 或者 提前结束{"aa"}。正常的有{}
|
break;
|
case '[':
|
isError = arrayStart && state == 0;//重复开始错误
|
break;
|
case ']':
|
isError = !arrayStart || jsonStart;//重复开始错误 或者 Json 未结束
|
break;
|
case '"':
|
case '\'':
|
isError = !(jsonStart || arrayStart); //json 或数组开始。
|
if (!isError)
|
{
|
//重复开始 [""",{"" "}]
|
isError = (state == 0 && keyStart == -1) || (state == 1 && valueStart == -1);
|
}
|
if (!isError && arrayStart && !jsonStart && c == '\'')//['aa',{}]
|
{
|
isError = true;
|
}
|
break;
|
case ':':
|
isError = !jsonStart || state == 1;//重复出现。
|
break;
|
case ',':
|
isError = !(jsonStart || arrayStart); //json 或数组开始。
|
if (!isError)
|
{
|
if (jsonStart)
|
{
|
isError = state == 0 || (state == 1 && valueStart > 1);//重复出现。
|
}
|
else if (arrayStart)//["aa,] [,] [{},{}]
|
{
|
isError = keyStart == 0 && !setDicValue;
|
}
|
}
|
break;
|
case ' ':
|
case '\r':
|
case '\n'://[ "a",\r\n{} ]
|
case '\0':
|
case '\t':
|
break;
|
default: //值开头。。
|
isError = (!jsonStart && !arrayStart) || (state == 0 && keyStart == -1) || (valueStart == -1 && state == 1);//
|
break;
|
}
|
//if (isError)
|
//{
|
|
//}
|
}
|
}
|
/// <summary>
|
/// 设置字符状态(返回true则为关键词,返回false则当为普通字符处理) qy 2024-7-15
|
/// </summary>
|
private static bool SetCharState(char c, ref CharState cs)
|
{
|
cs.CheckIsError(c);
|
switch (c)
|
{
|
case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]
|
#region 大括号
|
if (cs.keyStart <= 0 && cs.valueStart <= 0)
|
{
|
cs.keyStart = 0;
|
cs.valueStart = 0;
|
if (cs.jsonStart && cs.state == 1)
|
{
|
cs.childrenStart = true;
|
}
|
else
|
{
|
cs.state = 0;
|
}
|
cs.jsonStart = true;//开始。
|
return true;
|
}
|
#endregion
|
break;
|
case '}':
|
#region 大括号结束
|
if (cs.keyStart <= 0 && cs.valueStart < 2 && cs.jsonStart)
|
{
|
cs.jsonStart = false;//正常结束。
|
cs.state = 0;
|
cs.keyStart = 0;
|
cs.valueStart = 0;
|
cs.setDicValue = true;
|
return true;
|
}
|
// cs.isError = !cs.jsonStart && cs.state == 0;
|
#endregion
|
break;
|
case '[':
|
#region 中括号开始
|
if (!cs.jsonStart)
|
{
|
cs.arrayStart = true;
|
return true;
|
}
|
else if (cs.jsonStart && cs.state == 1)
|
{
|
cs.childrenStart = true;
|
return true;
|
}
|
#endregion
|
break;
|
case ']':
|
#region 中括号结束
|
if (cs.arrayStart && !cs.jsonStart && cs.keyStart <= 2 && cs.valueStart <= 0)//[{},333]//这样结束。
|
{
|
cs.keyStart = 0;
|
cs.valueStart = 0;
|
cs.arrayStart = false;
|
return true;
|
}
|
#endregion
|
break;
|
case '"':
|
case '\'':
|
#region 引号
|
if (cs.jsonStart || cs.arrayStart)
|
{
|
if (cs.state == 0)//key阶段,有可能是数组["aa",{}]
|
{
|
if (cs.keyStart <= 0)
|
{
|
cs.keyStart = (c == '"' ? 3 : 2);
|
return true;
|
}
|
else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"'))
|
{
|
if (!cs.escapeChar)
|
{
|
cs.keyStart = -1;
|
return true;
|
}
|
else
|
{
|
cs.escapeChar = false;
|
}
|
}
|
}
|
else if (cs.state == 1 && cs.jsonStart)//值阶段必须是Json开始了。
|
{
|
if (cs.valueStart <= 0)
|
{
|
cs.valueStart = (c == '"' ? 3 : 2);
|
return true;
|
}
|
else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"'))
|
{
|
if (!cs.escapeChar)
|
{
|
cs.valueStart = -1;
|
return true;
|
}
|
else
|
{
|
cs.escapeChar = false;
|
}
|
}
|
|
}
|
}
|
#endregion
|
break;
|
case ':':
|
#region 冒号
|
if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0)
|
{
|
if (cs.keyStart == 1)
|
{
|
cs.keyStart = -1;
|
}
|
cs.state = 1;
|
return true;
|
}
|
// cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1);
|
#endregion
|
break;
|
case ',':
|
#region 逗号 //["aa",{aa:12,}]
|
|
if (cs.jsonStart)
|
{
|
if (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1)
|
{
|
cs.state = 0;
|
cs.keyStart = 0;
|
cs.valueStart = 0;
|
//if (cs.valueStart == 1)
|
//{
|
// cs.valueStart = 0;
|
//}
|
cs.setDicValue = true;
|
return true;
|
}
|
}
|
else if (cs.arrayStart && cs.keyStart <= 2)
|
{
|
cs.keyStart = 0;
|
//if (cs.keyStart == 1)
|
//{
|
// cs.keyStart = -1;
|
//}
|
return true;
|
}
|
#endregion
|
break;
|
case ' ':
|
case '\r':
|
case '\n'://[ "a",\r\n{} ]
|
case '\0':
|
case '\t':
|
if (cs.keyStart <= 0 && cs.valueStart <= 0) //cs.jsonStart &&
|
{
|
return true;//跳过空格。
|
}
|
break;
|
default: //值开头。。
|
if (c == '\\') //转义符号
|
{
|
if (cs.escapeChar)
|
{
|
cs.escapeChar = false;
|
}
|
else
|
{
|
cs.escapeChar = true;
|
return true;
|
}
|
}
|
else
|
{
|
cs.escapeChar = false;
|
}
|
if (cs.jsonStart || cs.arrayStart) // Json 或数组开始了。
|
{
|
if (cs.keyStart <= 0 && cs.state == 0)
|
{
|
cs.keyStart = 1;//无引号的
|
}
|
else if (cs.valueStart <= 0 && cs.state == 1 && cs.jsonStart)//只有Json开始才有值。
|
{
|
cs.valueStart = 1;//无引号的
|
}
|
}
|
break;
|
}
|
return false;
|
}
|
|
#endregion
|
|
public static LinqExpressionType GetLinqCondition(this string stringType)
|
{
|
LinqExpressionType linqExpression;
|
switch (stringType)
|
{
|
case HtmlElementType.Contains:
|
linqExpression = LinqExpressionType.In;
|
break;
|
case HtmlElementType.ThanOrEqual:
|
linqExpression = LinqExpressionType.ThanOrEqual;
|
break;
|
case HtmlElementType.LessOrequal:
|
linqExpression = LinqExpressionType.LessThanOrEqual;
|
break;
|
case HtmlElementType.GT:
|
linqExpression = LinqExpressionType.GreaterThan;
|
break;
|
case HtmlElementType.lt:
|
linqExpression = LinqExpressionType.LessThan;
|
break;
|
case HtmlElementType.like:
|
linqExpression = LinqExpressionType.Contains;
|
break;
|
default:
|
linqExpression = LinqExpressionType.Equal;
|
break;
|
}
|
return linqExpression;
|
}
|
}
|
}
|