格式化、验证、压缩和转换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; }
}
}