json格式化、验证、压缩和转换json数据
格式化、验证、压缩和转换JSON数据
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
using System.Text;
using System.Xml;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace SaaS.OfficialWebSite.Web.Controllers
{public class JsonController : Controller{public IActionResult Index(){return View();}private readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions{WriteIndented = true,PropertyNameCaseInsensitive = true};[HttpPost]public IActionResult FormatJson([FromBody] JsonFormatRequest request){try{// 首先验证JSON是否有效var jsonDocument = JsonDocument.Parse(request.Json);// 根据请求决定是否缩进string formattedJson;if (request.Indent){formattedJson = JsonSerializer.Serialize(jsonDocument,new JsonSerializerOptions { WriteIndented = true });}else{formattedJson = JsonSerializer.Serialize(jsonDocument,new JsonSerializerOptions { WriteIndented = false });}return Ok(new { formattedJson });}catch (JsonException ex){return BadRequest(new { message = $"无效的JSON: {ex.Message}" });}catch (Exception ex){return BadRequest(new { message = $"处理JSON时出错: {ex.Message}" });}}[HttpPost]public IActionResult ValidateJson([FromBody] JsonValidateRequest request){try{var jsonDocument = JsonDocument.Parse(request.Json);string formattedJson = JsonSerializer.Serialize(jsonDocument,new JsonSerializerOptions { WriteIndented = true });return Ok(new{isValid = true,formattedJson});}catch (JsonException ex){return Ok(new{isValid = false,errorMessage = ex.Message});}catch (Exception ex){return BadRequest(new { message = $"验证JSON时出错: {ex.Message}" });}}[HttpPost]public IActionResult ConvertToXml([FromBody] JsonConvertRequest request){try{// 首先将JSON解析为JsonDocumentusing var jsonDocument = JsonDocument.Parse(request.Json);// 创建XML文档var xmlDocument = new XmlDocument();var xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null);xmlDocument.AppendChild(xmlDeclaration);// 创建根元素var rootElement = xmlDocument.CreateElement("root");xmlDocument.AppendChild(rootElement);// 递归转换JSON到XMLConvertJsonToXml(jsonDocument.RootElement, xmlDocument, rootElement);// 格式化XML输出var stringBuilder = new StringBuilder();var settings = new XmlWriterSettings{Indent = true,IndentChars = " ",NewLineChars = "\n",NewLineHandling = NewLineHandling.Replace};using (var xmlWriter = XmlWriter.Create(stringBuilder, settings)){xmlDocument.Save(xmlWriter);}return Ok(new { result = stringBuilder.ToString() });}catch (JsonException ex){return BadRequest(new { message = $"无效的JSON: {ex.Message}" });}catch (Exception ex){return BadRequest(new { message = $"转换为XML时出错: {ex.Message}" });}}[HttpPost]public IActionResult ConvertToYaml([FromBody] JsonConvertRequest request){try{var jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(request.Json);var serializer = new SerializerBuilder().Build();var fixedObj = FixJsonTypes(jsonObj);var yaml =serializer.Serialize(fixedObj);return Ok(new { result = yaml });}catch (Newtonsoft.Json.JsonException ex){return BadRequest(new { message = $"无效的JSON: {ex.Message}" });}catch (Exception ex){return BadRequest(new { message = $"转换为YAML时出错: {ex.Message}" });}}// 修复 JArray/JObject 转换为 List<object> 或 Dictionary<string, object>private static object FixJsonTypes(object value){if (value is Newtonsoft.Json.Linq.JArray jArray){// 递归处理数组中的每个元素return jArray.Select(FixJsonTypes).ToList();}else if (value is Newtonsoft.Json.Linq.JObject jObject){// 递归处理对象中的每个属性return jObject.Properties().ToDictionary(prop => prop.Name, prop => FixJsonTypes(prop.Value));}else if (value is Newtonsoft.Json.Linq.JValue jValue){// 直接返回原始值(如 string, int, bool, null 等)return jValue.Value;}else{// 如果不是 JToken 类型(如直接传入 Dictionary<string, object>),直接返回return value;}}[HttpPost]public IActionResult ConvertToCsv([FromBody] JsonConvertRequest request){try{// 假设JSON是一个对象数组var jsonDocument = JsonDocument.Parse(request.Json);if (jsonDocument.RootElement.ValueKind != JsonValueKind.Array){return BadRequest(new { message = "CSV转换需要JSON数组" });}var stringBuilder = new StringBuilder();// 处理第一行 - 标题行var firstElement = jsonDocument.RootElement.EnumerateArray().FirstOrDefault();if (firstElement.ValueKind == JsonValueKind.Object){var headers = firstElement.EnumerateObject().Select(p => p.Name);stringBuilder.AppendLine(string.Join(",", headers));}// 处理数据行foreach (var element in jsonDocument.RootElement.EnumerateArray()){if (element.ValueKind == JsonValueKind.Object){var values = element.EnumerateObject().Select(p =>$"\"{p.Value.ToString().Replace("\"", "\"\"")}\"");stringBuilder.AppendLine(string.Join(",", values));}}return Ok(new { result = stringBuilder.ToString() });}catch (JsonException ex){return BadRequest(new { message = $"无效的JSON: {ex.Message}" });}catch (Exception ex){return BadRequest(new { message = $"转换为CSV时出错: {ex.Message}" });}}private void ConvertJsonToXml(JsonElement jsonElement, XmlDocument xmlDocument, XmlElement parentElement){switch (jsonElement.ValueKind){case JsonValueKind.Object:foreach (var property in jsonElement.EnumerateObject()){var element = xmlDocument.CreateElement(property.Name);parentElement.AppendChild(element);ConvertJsonToXml(property.Value, xmlDocument, element);}break;case JsonValueKind.Array:int index = 0;foreach (var item in jsonElement.EnumerateArray()){var element = xmlDocument.CreateElement("item");element.SetAttribute("index", index.ToString());parentElement.AppendChild(element);ConvertJsonToXml(item, xmlDocument, element);index++;}break;case JsonValueKind.String:parentElement.InnerText = jsonElement.GetString();break;case JsonValueKind.Number:parentElement.InnerText = jsonElement.GetRawText();break;case JsonValueKind.True:parentElement.InnerText = "true";break;case JsonValueKind.False:parentElement.InnerText = "false";break;case JsonValueKind.Null:parentElement.InnerText = "null";break;}}}public class JsonFormatRequest{public string Json { get; set; }public bool Indent { get; set; }}public class JsonValidateRequest{public string Json { get; set; }}public class JsonConvertRequest{public string Json { get; set; }}
}
运行效果:json格式化、验证、压缩和转换json数据