1.取值
static void Main(string[] args)
{
JObject _jObject = JObject.Parse("{'student':{'ID':'001','Name':'test','Mark':'Hello Word'}}");
//var result = GetValue(_jObject, "student^ID", out string v);
var result = GetValueDynamic(_jObject, "student^ID", ref value);
if (result)
{
Console.WriteLine(v);
}
Console.ReadKey();
}
第一种:使用ojbect作为中间存储变量
/// <summary>
/// 根据传递的Key获取JObject中的值
/// </summary>
/// <param name="jobject"></param>
/// <param name="ks">^隔开的多维数组索引</param>
/// <param name="v">读取的结果</param>
/// <returns></returns>
public static bool GetValue(JObject jobject, string ks, out string v)
{
try
{
var k = ks.Split('^'); //k是一个^分割的多为数组索引的字符串,比如"1^2^3^4^5"
object A = null; //先设定个中间存储万能值object
for (var i = 0; i < k.Length - 1; i++)
{
A = i == 0 ? jobject[k[i]] : ((JObject)A)?[k[i]];
}
//取值
v = ((JObject)A)?[k[k.Length - 1]].ToString();
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
v = "";
return false;
}
第二中以动态类型dynamic作为中间存储类型
/// <summary>
/// 根据传递的Key获取JObject中的值
/// </summary>
/// <param name="jobject"></param>
/// <param name="ks">^隔开的多维数组索引</param>
/// <param name="v">读取的结果</param>
/// <returns></returns>
public static bool GetValueDynamic(JObject jobject, string ks, out string v)
{
try
{
var k = ks.Split('^'); //k是一个^分割的多为数组索引的字符串,比如"1^2^3^4^5"
dynamic A = null; //先设定个中间存储dynamic 动态类型
for (var i = 0; i < k.Length - 1; i++)
{
A = i == 0 ? jobject[k[i]] : A?[k[i]];
}
//取值
v = A?[k[k.Length - 1]].ToString();
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
v = "";
return false;
}
2.赋值
第一种:使用ojbect作为中间存储变量
/// <summary>
/// 给JObject对象赋值
/// </summary>
/// <param name="jobject"></param>
/// <param name="ks">^隔开的多维数组索引</param>
/// <param name="v">要赋的值</param>
/// <returns></returns>
public static bool SetValue(JObject jobject, string ks, string v)
{
try
{
var k = ks.Split('^'); //k是一个^分割的多为数组索引的字符串,比如"1^2^3^4^5"
object A = null; //先设定个中间存储万能值object
for (var i = 0; i < k.Length - 1; i++)
{
A = i == 0 ? jobject[k[i]] : ((JObject)A)?[k[i]];
}
//对最终结果赋值
if (A != null) ((JObject)A)[k[k.Length - 1]] = v;
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return false;
}
第二中以动态类型dynamic作为中间存储类型
public static bool SetValueDynamic(JObject jobject, string ks, string v)
{
try
{
var k = ks.Split('^'); //k是一个^分割的多为数组索引的字符串,比如"1^2^3^4^5"
dynamic A = null; //先设定个中间存储万能值object
for (var i = 0; i < k.Length - 1; i++)
{
A = i == 0 ? jobject[k[i]] : A?[k[i]];
}
//对最终结果赋值
if (A != null) A[k[k.Length - 1]] = v;
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return false;
}
3、把取值与赋值写成一个方法
static void Main(string[] args)
{
JObject _jObject = JObject.Parse("{'student':{'ID':'001','Name':'test','Mark':'Hello Word'}}");
var value = "003";
GetSetValueDynamic(_jObject, "student^ID", ref value);
var result = GetSetValueDynamic(_jObject, "student^ID", ref value);
if (result)
{
Console.WriteLine(value);
}
Console.ReadKey();
}
/// <summary>
/// JObject对象的取值与赋值
/// </summary>
/// <param name="jobject"></param>
/// <param name="ks">^隔开的Key</param>
/// <param name="v">为空的时候为取值,不为空的时候为赋值</param>
/// <returns>取值赋值成功返回true,否则返回false</returns>
public static bool GetSetValueDynamic(JObject jobject, string ks, ref string v)
{
try
{
var k = ks.Split('^'); //k是一个^分割的多为数组索引的字符串,比如"1^2^3^4^5"
dynamic A = null; //先设定个中间存储dynamic 动态类型
for (var i = 0; i < k.Length - 1; i++)
{
A = i == 0 ? jobject[k[i]] : A?[k[i]];
}
if (string.IsNullOrEmpty(v)) //v位空的时候为取值
{
v = A?[k[k.Length - 1]].ToString();
}
else
{
if (A != null) A[k[k.Length - 1]] = v;
}
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return false;
}