json格式化、验证、压缩和转换json数据

发布于:2025-06-23 ⋅ 阅读:(10) ⋅ 点赞:(0)

格式化、验证、压缩和转换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解析为JsonDocument
                using 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到XML
                ConvertJsonToXml(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数据


网站公告

今日签到

点亮在社区的每一天
去签到