• JsonHelper MergeJsonTemplate


    
    namespace Test
    {
        using Newtonsoft.Json;
        using System;
        using System.Collections.Generic;
        using System.IO;
        using System.Linq;
        using Microshaoft;
        using Newtonsoft.Json.Linq;
        class Program
        {
            static void Main(string[] args)
            {
                string json = @"
    { a: [{a:'asdasd',b:2222},{a:'@a.[2].a'},{a:'ssss'}]}
    ";
                string json2 = @"
    {a:['asdasd','aaaa',{a:1111}]}
    ";
                Console.WriteLine
                            (
                                JsonHelper
                                    .MergeJsonTemplate
                                        (
                                            json
                                            , json2
                                        )
                            );
                Console.ReadLine();
            }
            static void Main2(string[] args)
            {
                string json = @"{ 'name10': 
    'Admin' }
    [{ 'name9': 'Publisher' }][
    { 'name4': 'Admin' },{ 'name8': ['Admin'] }]{ 'name7': 
    'Admin' }
    [{ 'name3': ['Publisher','Publisher'] }]{ 'name5': 
    'Admin' }
    [{ 'name2': 'Publisher' }]{ 'name6': 
    'Admin' }
    [{ 'name1': 'Publisher' }]";
                JsonTextReader reader = new JsonTextReader(new StringReader(json));
                var r = reader.ReadAllMultipleContentsAsEnumerable<JObject>().ToArray();
                reader = new JsonTextReader(new StringReader(json));
                r = reader
                        .ReadMultipleContentsAsEnumerable<JObject>(3)
                        .SelectMany
                            (
                                (x) =>
                                {
                                    return x;
                                }
                            ).ToArray();
                Console.ReadLine();
            }
            static void Main1(string[] args)
            {
                string json = @"{ 'name': 
    'Admin',c:1111111 }
    [{ 'name': 'Publisher' }][
    { 'name': 'Admin' },{ 'name': 'Admin' }]{ 'name': 
    'Admin' }
    [{ 'name': 'Publisher' }]{ 'name': 
    'Admin' }
    [{ 'name': 'Publisher' }]{ 'name': 
    'Admin' }
    [{ 'name': 'Publisher' }]";
                IList<Role> roles = new List<Role>();
                JsonTextReader reader = new JsonTextReader(new StringReader(json));
                var r = reader.ReadAllMultipleContentsAsEnumerable<Role>().ToArray();
                reader = new JsonTextReader(new StringReader(json));
                r = reader
                        .ReadMultipleContentsAsEnumerable<Role>(3)
                        .SelectMany
                            (
                                (x) =>
                                {
                                    return x;
                                }
                            ).ToArray();
                Console.ReadLine();
            }
        }
        public class Role
        {
            public string Name { get; set; }
        }
    }
    namespace Microshaoft
    {
        using Newtonsoft.Json;
        using Newtonsoft.Json.Linq;
        using System;
        using System.IO;
        using System.Linq;
        using System.Xml.Linq;
        using System.Collections.Generic;
        public static class JsonHelper
        {
            public static JToken MergeJsonTemplateToJToken
                            (
                                string jsonTemplate
                                , string jsonData
                                , string jsonTemplatePathPrefix = "@"
                            )
            {
                var jTokenTemplate = JToken.Parse(jsonTemplate);
                var jTokenData = JToken.Parse(jsonData);
                JsonReaderHelper
                        .ReadAllPaths
                            (
                                jsonTemplate
                                , (isJArray, jsonPath, valueObject, valueType, reader) =>
                                {
                                    var vs = valueObject as string;
                                    if (vs != null)
                                    {
                                        vs = vs.Trim();
                                        if (vs.StartsWith(jsonTemplatePathPrefix))
                                        {
                                            var replacedSelectToken = jTokenTemplate.SelectToken(jsonPath);
                                            var trimChars = jsonTemplatePathPrefix.ToCharArray();
                                            vs = vs.TrimStart(trimChars);
                                            var replacementSelectToken = jTokenData.SelectToken(vs);
                                            replacedSelectToken.Replace(replacementSelectToken);
                                        }
                                    }
                                    return false;
                                }
                            );
                return jTokenTemplate;
            }
            public static string MergeJsonTemplate
                    (
                        string jsonTemplate
                        , string jsonData
                        , string jsonTemplatePathPrefix = "@"
                    )
            {
                return
                        MergeJsonTemplateToJToken
                                    (
                                        jsonTemplate
                                        , jsonData
                                        , jsonTemplatePathPrefix
                                    )
                                    .ToString();
            }
            public static string XmlToJson
                                    (
                                        string xml
                                        , Newtonsoft
                                                .Json
                                                .Formatting formatting
                                                                = Newtonsoft
                                                                        .Json
                                                                        .Formatting
                                                                        .Indented
                                        , bool needKeyQuote = false
                                    )
            {
                XNode xElement;
                xElement = XElement.Parse(xml).Elements().First();
                string json = string.Empty;
                using (var stringWriter = new StringWriter())
                {
                    using (var jsonTextWriter = new JsonTextWriter(stringWriter))
                    {
                        jsonTextWriter.Formatting = formatting;
                        jsonTextWriter.QuoteName = needKeyQuote;
                        var jsonSerializer = new JsonSerializer();
                        jsonSerializer.Serialize(jsonTextWriter, xElement);
                        json = stringWriter.ToString();
                    }
                }
                return json;
            }
            public static string JsonToXml
                            (
                                string json
                                , bool needRoot = false
                                , string defaultDeserializeRootElementName = "root"
                            )
            {
                if (needRoot)
                {
                    json = string.Format
                                    (
                                        @"{{ {1}{0}{2} }}"
                                        , " : "
                                        , defaultDeserializeRootElementName
                                        , json
                                    );
                }
                //XmlDocument xmlDocument = JsonConvert.DeserializeXmlNode(json, defaultDeserializeRootElementName);
                var xDocument = JsonConvert
                                        .DeserializeXNode
                                            (
                                                json
                                                , defaultDeserializeRootElementName
                                            );
                var xml = xDocument
                                .Elements()
                                .First()
                                .ToString();
                return xml;
            }
            public static T DeserializeByJTokenPath<T>
                (
                    string json
                    , string jTokenPath = null //string.Empty
                )
            {
                var jObject = JObject.Parse(json);
                var jsonSerializer = new JsonSerializer();
                if (string.IsNullOrEmpty(jTokenPath))
                {
                    jTokenPath = string.Empty;
                }
                var jToken = jObject.SelectToken(jTokenPath);
                using (var jsonReader = jToken.CreateReader())
                {
                    return
                        jsonSerializer
                            .Deserialize<T>(jsonReader);
                }
            }
            public static string Serialize
                                    (
                                        object target
                                        , bool formattingIndented = false
                                        , bool keyQuoteName = false
                                    )
            {
                string json = string.Empty;
                using (StringWriter stringWriter = new StringWriter())
                {
                    using (var jsonTextWriter = new JsonTextWriter(stringWriter))
                    {
                        jsonTextWriter.QuoteName = keyQuoteName;
                        jsonTextWriter.Formatting = (formattingIndented ? Formatting.Indented : Formatting.None);
                        var jsonSerializer = new JsonSerializer();
                        jsonSerializer.Serialize(jsonTextWriter, target);
                        json = stringWriter.ToString();
                    }
                }
                return json;
            }
            public static void ReadJsonPathsValuesAsStrings
                                (
                                    string json
                                    , string[] jsonPaths
                                    , Func<string, string, bool> onReadedOncePathStringValueProcesssFunc = null
                                )
            {
                using (var stringReader = new StringReader(json))
                {
                    using (var jsonReader = new JsonTextReader(stringReader))
                    {
                        bool breakAndReturn = false;
                        while
                            (
                                jsonReader.Read()
                                &&
                                !breakAndReturn
                            )
                        {
                            foreach (var x in jsonPaths)
                            {
                                if (x == jsonReader.Path)
                                {
                                    if (onReadedOncePathStringValueProcesssFunc != null)
                                    {
                                        var s = jsonReader.ReadAsString();
                                        breakAndReturn
                                                = onReadedOncePathStringValueProcesssFunc
                                                        (
                                                            x
                                                            , s
                                                        );
                                        if (breakAndReturn)
                                        {
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            public static IEnumerable<TElement>
                                DeserializeToFromDictionary<TKey, TValue, TElement>
                                            (
                                                string json
                                                , Func<TKey, TValue, TElement> OnOneElementProcessFunc
                                            )
            {
                //IEnumerable<TElement> r = default(IEnumerable<TElement>);
                return
                        DeserializeByJTokenPath<Dictionary<TKey, TValue>>(json)
                            .Select
                                (
                                    (x) =>
                                    {
                                        var rr = OnOneElementProcessFunc(x.Key, x.Value);
                                        return rr;
                                    }
                                );
                //return r;
            }
        }
    }
    namespace Microshaoft
    {
        using Newtonsoft.Json;
        using Newtonsoft.Json.Linq;
        using System.Collections.Generic;
        using System;
        using System.IO;
        public static class JsonReaderHelper
        {
            public static void ReadAllPaths
                        (
                            string json
                            , Func<bool, string, object, Type, JsonReader, bool> onReadPathOnceProcessFunc
                        )
            {
                using (JsonReader reader = new JsonTextReader(new StringReader(json)))
                {
                    var isStarted = false;
                    var isJArray = false;
                    while (reader.Read())
                    {
                        JsonToken tokenType = reader.TokenType;
                        if (!isStarted)
                        {
                            if (tokenType == JsonToken.StartArray)
                            {
                                isJArray = true;
                                isStarted = true;
                            }
                            else if (tokenType == JsonToken.StartArray)
                            {
                                isStarted = true;
                            }
                            else if (tokenType == JsonToken.StartConstructor)
                            {
                                isStarted = true;
                            }
                        }
                        if
                            (
                                tokenType != JsonToken.Comment
                                &&
                                tokenType != JsonToken.PropertyName
                            )
                        {
                            var jsonPath = reader.Path;
                            if (!string.IsNullOrEmpty(jsonPath))
                            {
                                var valueType = reader.ValueType;
                                var valueObject = reader.Value;
                                if (valueType != null)
                                {
                                    var r = onReadPathOnceProcessFunc
                                                    (
                                                        isJArray
                                                        , jsonPath
                                                        , valueObject
                                                        , valueType
                                                        , reader
                                                    );
                                    if (r)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    reader.Close();
                }
            }
            public static void ReadAllMultipleContents
                                            (
                                                this JsonReader target
                                            )
            {
                if (!target.SupportMultipleContent)
                {
                    target.SupportMultipleContent = true;
                }
                var serializer = new JsonSerializer();
                //serializer.CheckAdditionalContent
                while (target.Read())
                {
                    Console.WriteLine(target.TokenType);
                    var r = serializer.Deserialize(target);
                    Console.WriteLine(r.GetType());
                    Console.WriteLine(r.ToString());
                }
            }
            public static IEnumerable<JToken> ReadMultipleContents
                                                    (
                                                        this JsonReader target
                                                    )
            {
                if (!target.SupportMultipleContent)
                {
                    target.SupportMultipleContent = true;
                }
                var serializer = new JsonSerializer();
                while (target.Read())
                {
                    if (target.TokenType == JsonToken.StartObject)
                    {
                        JToken entry = serializer.Deserialize<JToken>(target);
                        yield return entry;
                    }
                    else if (target.TokenType == JsonToken.StartArray)
                    {
                        JArray entries = serializer.Deserialize<JArray>(target);
                        foreach (var entry in entries)
                        {
                            if (entry is JArray)
                            {
                                //Console.WriteLine();
                            }
                            yield return (JToken)entry;
                        }
                    }
                }
            }
            public static IEnumerable<IEnumerable<T>> ReadMultipleContentsAsEnumerable<T>
                            (
                                this JsonReader target
                                , int pageSize = 10
                            )
            {
                if (!target.SupportMultipleContent)
                {
                    target.SupportMultipleContent = true;
                }
                var serializer = new JsonSerializer();
                var list = new List<T>();
                var i = 0;
                while (target.Read())
                {
                    if (target.TokenType == JsonToken.StartArray)
                    {
                        var entries = serializer.Deserialize<T[]>(target);
                        foreach (var entry in entries)
                        {
                            if (i < pageSize)
                            {
                                i++;
                                list.Add(entry);
                            }
                            if (i >= pageSize)
                            {
                                yield return list;
                                list.Clear();
                                i = 0;
                            }
                        }
                    }
                    else
                    {
                        var entry = serializer.Deserialize<T>(target);
                        if (i < pageSize)
                        {
                            i++;
                            list.Add(entry);
                        }
                        if (i >= pageSize)
                        {
                            yield return list;
                            list.Clear();
                            i = 0;
                        }
                    }
                }
                if (i > 0)
                {
                    yield return list;
                    list.Clear();
                    i = 0;
                    list = null;
                }
            }
            public static IEnumerable<T> ReadAllMultipleContentsAsEnumerable<T>(this JsonReader target)
            {
                if (!target.SupportMultipleContent)
                {
                    target.SupportMultipleContent = true;
                }
                var serializer = new JsonSerializer();
                while (target.Read())
                {
                    if (target.TokenType == JsonToken.StartArray)
                    {
                        var entries = serializer.Deserialize<T[]>(target);
                        foreach (var entry in entries)
                        {
                            yield return entry;
                        }
                    }
                    else
                    {
                        var entry = serializer.Deserialize<T>(target);
                        yield return entry;
                    }
                }
            }
        }
    }
    
    
  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/6158129.html
Copyright © 2020-2023  润新知