JObject 之多维数组的动态取值赋值

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值