using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web;
namespace System
{
public static class JsonValidExtension
{
///
/// JSON参数校验
///
///
///dic.Add("pwd","密码")
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, Dictionary<string, string> field)
{
return ValidJSONNotNullOrEmpty2(jsonStr, field);
}
///
/// JSON参数校验
///
///
///dic.Add("pwd","密码")
///JArray 对象
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, Dictionary<string, string> field, out JArray jarr)
{
return ValidJSONNotNullOrEmpty2(jsonStr, field, out jarr);
}
///
/// JSON参数校验
///
///
///dic.Add("pwd","密码")
///JObject 对象
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, Dictionary<string, string> field, out JObject jobj)
{
return ValidJSONNotNullOrEmpty2(jsonStr, field, out jobj);
}
///
/// JSON参数校验
///
///
///"name,pwd"
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, string fields)
{
if (string.IsNullOrEmpty(fields)) throw new ArgumentNullException("fields");
fields = fields.Replace(',', ',');
return ValidJSONNotNullOrEmpty2(jsonStr, ToDictionary(fields.Split(',')));
}
///
/// JSON参数校验
///
///
///"name,pwd"
///JArray对象
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, string fields, out JArray jarr)
{
if (string.IsNullOrEmpty(fields)) throw new ArgumentNullException("fields");
fields = fields.Replace(',', ',');
return ValidJSONNotNullOrEmpty2(jsonStr, ToDictionary(fields.Split(',')), out jarr);
}
///
/// JSON参数校验
///
///
///"name,pwd"
///JObject对象
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, string fields, out JObject jobj)
{
if (string.IsNullOrEmpty(fields)) throw new ArgumentNullException("fields");
fields = fields.Replace(',', ',');
return ValidJSONNotNullOrEmpty2(jsonStr, ToDictionary(fields.Split(',')), out jobj);
}
///
/// JSON参数校验
///
///
///new string[]{"name","pwd"}
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, string[] fields)
{
if (fields.Length == 0) throw new ArgumentNullException("fields");
return ValidJSONNotNullOrEmpty2(jsonStr, ToDictionary(fields));
}
///
/// JSON参数校验
///
///
///new string[]{"name","pwd"}
///JArray对象
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, string[] fields, out JArray jarr)
{
if (fields.Length == 0) throw new ArgumentNullException("fields");
return ValidJSONNotNullOrEmpty2(jsonStr, ToDictionary(fields), out jarr);
}
///
/// JSON参数校验
///
///
///new string[]{"name","pwd"}
///JObject对象
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, string[] fields, out JObject jobj)
{
if (fields.Length == 0) throw new ArgumentNullException("fields");
return ValidJSONNotNullOrEmpty2(jsonStr, ToDictionary(fields), out jobj);
}
///
/// 验证json序列化后的实体对象,不为空的属性需要加NotNull特性
///
/// 验证对象的类型
///
///验证对象的类型
///
public static string ValidJSONNotNullOrEmpty(this string jsonStr, T targetType)
{
StringBuilder strb = new StringBuilder();
if (null == targetType) strb.Append("校验对象为null ");
else
{
Type type = targetType.GetType();
PropertyInfo[] pis = type.GetProperties();
foreach (PropertyInfo item in pis)
{
if (null != (item.GetCustomAttribute(typeof(NotNullAttribute)) as NotNullAttribute))
{
object v = item.GetValue(targetType);
if (null == v || string.IsNullOrEmpty(v.ToString())) strb.AppendFormat("{0}, ", item.Name);
}
}
}
if (!string.IsNullOrEmpty(strb.ToString()))
{
strb.Append("不能为空");
NLog.LogManager.GetCurrentClassLogger().Warn(strb.ToString());
}
return strb.ToString();
}
static string ValidJSONNotNullOrEmpty2(string jsonStr, Dictionary<string, string> field)
{
try
{
switch (JToken.Parse(jsonStr).Type)
{
case JTokenType.Array:
JArray jarr = JArray.Parse(jsonStr);
return ValidJArray(jarr, field);
case JTokenType.Object:
JObject jobj = JObject.Parse(jsonStr);
return ValidJObject(jobj, field);
}
}
catch
{
return "JSON格式错误";
}
return null;
}
static string ValidJSONNotNullOrEmpty2(string jsonStr, Dictionary<string, string> field, out JArray jarr)
{
jarr = null;
try
{
switch (JToken.Parse(jsonStr).Type)
{
case JTokenType.Array:
jarr = JArray.Parse(jsonStr);
return ValidJArray(jarr, field);
case JTokenType.Object:
JObject jobj = JObject.Parse(jsonStr);
return ValidJObject(jobj, field);
}
}
catch
{
return "JSON格式错误";
}
return null;
}
static string ValidJSONNotNullOrEmpty2(string jsonStr, Dictionary<string, string> field, out JObject jobj)
{
jobj = null;
try
{
switch (JToken.Parse(jsonStr).Type)
{
case JTokenType.Array:
JArray jarr = JArray.Parse(jsonStr);
return ValidJArray(jarr, field);
case JTokenType.Object:
jobj = JObject.Parse(jsonStr);
return ValidJObject(jobj, field);
}
}
catch
{
return "JSON格式错误";
}
return null;
}
static string ValidJObject(JObject jobj, Dictionary<string, string> field)
{
string validResult = null;
foreach (var item in jobj)
{
validResult = Valid(item, field);
if (!string.IsNullOrEmpty(validResult)) return validResult;
}
return null;
}
static string Valid(KeyValuePair<string, JToken> kvp, Dictionary<string, string> field)
{
//验证参数名不区分大小写
Dictionary<string, string> temp = new Dictionary<string,string>();
foreach (var item in field) temp.Add(item.Key.ToLower(), item.Value);
string validResult = null;
switch (kvp.Value.Type)
{
case JTokenType.Array:
validResult = ValidJArray((JArray)kvp.Value, temp);
if (!string.IsNullOrEmpty(validResult)) return validResult;
break;
case JTokenType.Object:
validResult = ValidJObject((JObject)kvp.Value, temp);
if (!string.IsNullOrEmpty(validResult)) return validResult;
break;
default:
if (string.IsNullOrEmpty(kvp.Value.ToString()))
if (temp.ContainsKey(kvp.Key.ToLower())) return temp[kvp.Key.ToLower()] + "不能为空";
break;
}
return null;
}
static string ValidJArray(JArray jarr, Dictionary<string, string> field)
{
string validResult = null;
foreach (var item in jarr)
{
switch (item.Type)
{
case JTokenType.Array:
validResult = ValidJArray((JArray)item, field);
if (!string.IsNullOrEmpty(validResult)) return validResult;
break;
case JTokenType.Object:
validResult = ValidJObject((JObject)item, field);
if (!string.IsNullOrEmpty(validResult)) return validResult;
break;
}
}
return null;
}
static Dictionary<string, string> ToDictionary(string[] fields)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var item in fields) dic.Add(item, "参数");
return dic;
}
}
}