public sealed class SearchParameterToken : IEnumerable<SearchParameterToken>
{
private readonly Dictionary<string, JToken> jTokens = new Dictionary<string, JToken>();
internal SearchParameterToken(string queryJson)
{
queryJson = queryJson ?? string.Empty;
var tokenObject = string.IsNullOrEmpty(queryJson) ? JToken.Parse("{}") : JToken.Parse(queryJson.Replace(" ", ""));
jTokens.Clear();
SetQueryStringList(tokenObject, jTokens);
}
private SearchParameterToken(string parameterName, JToken jToken)
{
this.ParameterName = parameterName;
this.PrivateToken = jToken;
}
public static SearchParameterToken FromString(string queryJson)
{
return new SearchParameterToken(queryJson);
}
public SearchParameterToken this[string parmterName]
{
get
{
if (jTokens.TryGetValue(parmterName, out JToken jToken))
return new SearchParameterToken(parmterName, jToken);
return new SearchParameterToken(parmterName, null);
}
}
public string ParameterName { get; private set; }
private JToken PrivateToken { get; set; }
public T GetValue<T>(T defaultValue = default, JsonSerializer jsonSerializer = null)
{
if (PrivateToken == null)
return defaultValue;
if (CheckIfAnonymousType<T>())
return PrivateToken.ToObject<T>(jsonSerializer ?? JsonSerializer.CreateDefault());
if (typeof(T).IsPrimitive == false && typeof(T) != typeof(string))
return PrivateToken.ToObject<T>();
return PrivateToken.Value<T>();
}
private void SetQueryStringList(JToken jToken, Dictionary<string, JToken> queryStrList)
{
if (jToken.Type == JTokenType.Array || jToken.Type == JTokenType.Object)
{
foreach (var item in jToken)
SetQueryStringList(item, queryStrList);
}
else
{
if (jToken.Type == JTokenType.Property)
{
JProperty jProperty = jToken as JProperty;
queryStrList.Add(jProperty.Name, jProperty.Value);
}
}
}
public IEnumerator<SearchParameterToken> GetEnumerator()
{
return jTokens.Select(t => new SearchParameterToken(t.Key, t.Value)).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return jTokens.Select(t => new SearchParameterToken(t.Key, t.Value)).GetEnumerator();
}
private bool CheckIfAnonymousType<T>()
{
Type type = typeof(T);
return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
&& type.IsGenericType && type.Name.Contains("AnonymousType")
&& (type.Name.StartsWith("<>"))
&& (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic;
}
}
调用:
var sstttts = "{\"A\":\"a\",\"B\":\"b\"}";
var queryJson = "{\"FBillNo\":\"\",\"OrderDateStart\":" + sstttts + ",\"OrderDateEnd\":\"\",\"ConfirmDateStart\":\"\",\"ConfirmDateEnd\":\"ssdfsdf\",\"FSupplyIDName\":[2,3,5,8],\"FBizName\":[{\"city\":\"sz\"},{\"city\":\"sh\"}],\"F_TMHJ_FConfirm\":\"1\",\"FClose\":\"N\"}";
SearchParameterToken searchParameterToken = SearchParameterToken.FromString(queryJson);
var ss = searchParameterToken["ConfirmDateStart"]?.GetValue<string>();
var sst = searchParameterToken["ConfirmDateEnd"]?.GetValue<string>();
var sszt = searchParameterToken["ConfirmDateEnd33"]?.GetValue<string>("this is test");
var testString = searchParameterToken["OrderDateStart"]?.GetValue(new { A = "", B = "" });