当前位置: 首页 > news >正文

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数据

http://www.lryc.cn/news/573760.html

相关文章:

  • C++ 第二阶段:类与对象 - 第三节:成员函数与访问权限
  • 理解贝叶斯分析中的“模型比较”部分
  • 【ISP】WDR and HDR
  • Netty ChannelPipeline和ChannelHandler详解
  • 61-Oracle SQL Monitor-实操
  • 多源异构数据接入与实时分析:衡石科技的技术突破
  • RabbitMQ从入门到实践:消息队列核心原理与典型应用场景
  • Java基础 6.22
  • 开源 python 应用 开发(一)python、pip、pyAutogui、python opencv安装
  • 通达信【千军趋势决策系统】幅图指标
  • idea2023+zulu-jdk+maven3.9.10
  • 创建 Vue 3.0 项目的两种方法对比:npm init vue@latest vs npm init vite@latest
  • 新冠疫情分布动态展示图
  • 多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程
  • Javaweb - 3 CSS
  • 没掌握的知识点记录
  • 基于全志T133-s3 busybox 设置登录用户名及密码
  • 【队列】-----【简单的数据结构】
  • leetcode:面试题 08.06. 汉诺塔问题
  • 【unitrix】 4.1 类型级加一操作(Add1.rs)
  • 大模型应用:如何使用Langchain+Qwen部署一套Rag检索系统
  • 【教程】不同架构(armv7l等)下载Miniconda安装包
  • RA4M2开发IOT(11)----ADC检测电压
  • 如何用AI开发完整的小程序<10>—总结
  • webRTC源码配置和编译 + Vscode Intelligence配置
  • 9大策略深度解析MySQL多表JOIN性能优化
  • Python-break、continue与else语句
  • 实战记录:minapp框架下跨机型接口调用顺序引发的兼容性问题
  • 如何仅用AI开发完整的小程序<6>—让AI对视觉效果进行升级
  • AAudio:Android 低延迟音频处理的核心组件