zoukankan      html  css  js  c++  java
  • [原创] C# dynamic拼接Json串

    using Newtonsoft.Json;

    之前拼接两个json串,是用的这样的代码

      var tmp = "," + json1.Substring(1, json1.Length - 2);
      json2 = json2.Insert(json2 - 1, tmp);

    虽然效率挺高的,但是代码很丑啊

    字符串操作的缺陷:

    1)不优雅

    2)不通用

    3)没有办法替换原有的值 

    后来想起可以用dynamic类型来实现

     string json111, json112;
                json111 = "{'a':1,'b':2,'d':{}}";
                json112 = "{'c':[1,2,3]}";
                Console.WriteLine(json111);
                Console.WriteLine(json112);
                dynamic d111 = JsonConvert.DeserializeObject<object>(json111);
                dynamic d112 = JsonConvert.DeserializeObject<object>(json112);
                d111["c"] = d112["c"];
       
                string json110 = JsonConvert.SerializeObject(d111 as object);
                Console.WriteLine(json110);

    原来是用的 d111.c=d112.c,但是这又相当 不通用,而用 d111["c"]=d112["c"];用变量来代替属性显示更通用些

    甚至可以拼接二级属性

    d111["d"]["d2"] = d112["c"];

    这代码显示更优雅些,但是效率肯定不如直接字符串操作了!!

    通用代码如下:

            /// <summary>
            /// 拼接两个Json串,将targetJson插入到sourceJson中
            /// 暂时仅支持一级属性
            /// </summary>
            /// <param name="sourceJson">源Json串</param>
            /// <param name="targetJson">插入Json串</param>
            /// <param name="propNames">要插入Json的属性列表</param>
            /// <returns>拼接好的Json串</returns>
            static string ConcatJson(string sourceJson, string targetJson, string[] propNames)
            {
                dynamic source = JsonConvert.DeserializeObject<object>(sourceJson);
                dynamic target = JsonConvert.DeserializeObject<object>(targetJson);
                foreach (var prop in propNames)
                {
                    source[prop] = target[prop];
                }
    
                return JsonConvert.SerializeObject(source as object);
            }

     调用如下:

                string json111, json112;
                json111 = "{'a':1,'b':2,'d':{}}";
                json112 = "{'c':[1,2,3]}";
                Console.WriteLine(json111);
                Console.WriteLine(json112);
                string json113 = ConcatJson(json111, json112, new string[] {"c"});
                Console.WriteLine(json113);

    缺陷:

    1)需要传插入json的属性列表..还是与调用方有耦合(可以确定,用索引是不行的)

    2)效率不高,在不讲究效率的场景用还可以

    3)不支持多层插入.

    如果哪位大神有更好 的办法,请告知我,谢谢!!!

  • 相关阅读:
    Ubuntu18.04 Hadoop Standalone
    Shiro安全框架
    链表中环的的入口节点
    二维数组中的查找
    ElasticSearch快速入门
    logback日志配置
    RabbitMQ进阶笔记
    RabbitMQ入门笔记
    JUC-Lock锁及常用工具类
    Java中的线程池
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/6088616.html
Copyright © 2011-2022 走看看