首页 > 代码库 > JsonHelper MergeJsonTemplate

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 = http://www.mamicode.com/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;                }            }        }    }}

JsonHelper MergeJsonTemplate