출처 : 본인



어쩌다 보니 폰트 설치 유무를 확인하기 위해 Json 데이터를 Xml 데이터로 입맛에 맞게 변환할 일이 생겼다.

 

아래 샘플 소스를 올려본다.

해당 소스는 두 개의 파일로 이루어져 있으며 사용하기 위해서는 nuget으로 Newtonsoft.Json을 참조해야 한다.


Json 내용을 보면 알겠지만 root 가 많다. 

Newtonsoft.Json을 사용하면 root는 단일 root 여야 Json 객체로 변환할 수 있다.


model 클래스를 보면 이쁘게 잘 만들었는데, 본인이 만든게 아니라 vs에서 만들어 준 것이다. 

편집 -> 선택하여 붙여넣기

를 사용하면 된다.


 Json 파일 내용을 유심히 본다면 재귀적으로 되어있다는 것을 알 수 있다. 

그래서 FontRule 객체를 Xml 스트링으로 변환할 때 재귀 함수를 사용하였다.



2017/08/25 - [프로그램 자료/Visual C#] - Json parser 역직렬화 deserialize





JsonRuleToXmlRuleConverter.cs

using Newtonsoft.Json.Linq;

using System;

using System.Collections.Generic;

using System.Text;

 

namespace JsonRuleToXmlRule

{

    public class JsonRuleToXmlRuleConverter

    {

        #region raw json

        public static string Origin_JSON =

@"

{

   ""IsBuiltIn"": true,

   ""Condition"": null,

   ""Operator"": ""And"",

   ""Rules"": [

      {

         ""IsBuiltIn"": true,

         ""Condition"": null,

         ""Operator"": ""Or"",

         ""Rules"": [

            {

               ""IsBuiltIn"": true,

               ""Condition"": {

                  ""FontId"": null,

                  ""FontIdComparison"": ""EqualTo"",

                  ""FontName"": null,

                  ""FontNameComparison"": ""EqualTo"",

                  ""FontFamilyName"": ""HURenaissance140"",

                  ""FontFamilyNameComparison"": ""Include"",

                  ""Version"": null,

                  ""VersionComparison"": ""EqualTo"",

                  ""Tag"": ""FontInfo"",

                  ""IsBuiltIn"": true

               },

               ""Operator"": ""Unit"",

               ""Rules"": []

            },

            {

               ""IsBuiltIn"": true,

               ""Condition"": {

                  ""FontId"": null,

                  ""FontIdComparison"": ""EqualTo"",

                  ""FontName"": null,

                  ""FontNameComparison"": ""EqualTo"",

                  ""FontFamilyName"": ""HU르네상스140"",

                  ""FontFamilyNameComparison"": ""Include"",

                  ""Version"": null,

                  ""VersionComparison"": ""EqualTo"",

                  ""Tag"": ""FontInfo"",

                  ""IsBuiltIn"": true

               },

               ""Operator"": ""Unit"",

               ""Rules"": []

            }

         ]

      },

      {

         ""IsBuiltIn"": true,

         ""Condition"": {

            ""FontId"": null,

            ""FontIdComparison"": ""EqualTo"",

            ""FontName"": null,

            ""FontNameComparison"": ""EqualTo"",

            ""FontFamilyName"": ""HURenaissance140S"",

            ""FontFamilyNameComparison"": ""NotInclude"",

            ""Version"": null,

            ""VersionComparison"": ""EqualTo"",

            ""Tag"": ""FontInfo"",

            ""IsBuiltIn"": true

         },

         ""Operator"": ""Unit"",

         ""Rules"": []

      }

   ]

}

";

        #endregion

 

        public static string ToXml(string jsonRule)

        {

            string rule = string.Format(@" {{ ""Rule"" : {0}  }}", jsonRule);

            JObject tags = JObject.Parse(rule);

            FontRule font = tags["Rule"].ToObject<FontRule>();

            return font.ToXml();

        }

     

    }

   

}




FontModel.cs

using System;

using System.Runtime;

using System.Collections.Generic;

using System.Text;

namespace System.Runtime.CompilerServices

{

    public class ExtensionAttribute : Attribute { }

}

namespace JsonRuleToXmlRule

{

    public class FontRule

    {

        public bool IsBuiltIn { get; set; }

        public Condition Condition { get; set; }

        public string Operator { get; set; }

        public FontRule[] Rules { get; set; }

    }

 

    public class Condition

    {

        public string FontId { get; set; }

        public string FontIdComparison { get; set; }

        public string FontName { get; set; }

        public string FontNameComparison { get; set; }

        public string FontFamilyName { get; set; }

        public string FontFamilyNameComparison { get; set; }

        public string Version { get; set; }

        public string VersionComparison { get; set; }

        public string Tag { get; set; }

        public bool IsBuiltIn { get; set; }

    }

 

    public static class Ex

    {

        public static string ToXml(this FontRule rule)

        {

            if (rule.Operator.Contains("And") || rule.Operator.Contains("Or"))

            {

                string rtn = string.Empty;

                foreach (FontRule rl in rule.Rules)

                    rtn += rl.ToXml();

                return string.Format("<{0}>{1}</{0}>", rule.Operator, rtn);

            }

            else if (rule.Operator.Contains("Unit"))

                return string.Format("{0}", rule.Condition.ToXml());

            else

                return string.Empty;

        }

 

        public static string ToXml(this Condition con)

        {

            List<string> _list = new List<string>();

            if (!string.IsNullOrEmpty(con.FontId))

                _list.Add(string.Format("FontId=\"{0}\" FontIdComparison=\"{1}\"", con.FontId, con.FontIdComparison));

            if (!string.IsNullOrEmpty(con.FontName))

                _list.Add(string.Format("FontName=\"{0}\" FontNameComparison=\"{1}\"", con.FontName, con.FontNameComparison));

            if (!string.IsNullOrEmpty(con.FontFamilyName))

                _list.Add(string.Format("FontFamilyName=\"{0}\" FontFamilyNameComparison=\"{1}\"", con.FontFamilyName, con.FontFamilyNameComparison));

            if (!string.IsNullOrEmpty(con.Version))

                _list.Add(string.Format("Version=\"{0}\" VersionComparison=\"{1}\"", con.Version, con.VersionComparison));

 

            if (_list.Count > 0)

                return string.Format("<FontInfo {0}/>", string.Join(" ", _list.ToArray()));

            else

                return string.Empty;

        }

    }

 

}

 











Posted by motolies
,