출처 : 본인
어쩌다 보니 폰트 설치 유무를 확인하기 위해 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;
}
}
}