为了账号安全,请及时绑定邮箱和手机立即绑定

如何像 JSON.stringify() 那样在 C# 中对 json 进行字符串化/规范化

如何像 JSON.stringify() 那样在 C# 中对 json 进行字符串化/规范化

C#
子衿沉夜 2022-12-24 12:49:32
我想知道是否有比这更好、更不随意的方式来处理 JSON 字符串,就像 JSON.Stringify 所做的那样?string json = "{test: 'test'}";var stringified = JsonConvert.SerializeObject(JsonConvert.DeserializeObject<dynamic>(json));Console.WriteLine(stringified); //Prints {"test":"test"}似乎在 C# 中没有一种规范化字符串表示的方法。我不确定新的 .NET Core 3.0 及其新的 JSON 库。<edit: 为了让评论更明显一点,JSON.stringifyJavascript 字符串的所有输入都可能存在互操作性情况,无论是对象表示法还是已经字符串化。所以我想知道是否有比我提到的更好的处理方法。如果已经内置到框架中就更好了。可以在MDN Web Docs找到一个游乐场。在https://github.com/ethereum/wiki/wiki/JavaScript-API#web3tohex上有一个示例,即使是相同的{test: 'test'}JSON 对象也首先被字符串化,然后进行 HEX 编码。在 C# 中也可能存在这样的情况,即从其他来源读取字符串并且无论如何输出都需要采用字符串化形式。
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

问题是你正在比较在 JS中有一个OBJECT然后将它转换为 JSON,在 C# 中有一个STRING然后将它转换为 JSON。


如果您有一个 C# 对象,则等效JSON.stringify()于JsonConvert.SerializeObject(myObject). C# 不接受 JSON 语法(就像 JS 一样)来定义对象。


在您发布的 MDN 示例中,您会看到:


console.log(JSON.stringify({ x: 5, y: 6 }));

c# 等价物是(运行它):


 Console.WriteLine(JsonConvert.SerializeObject(new { x = 5, y = 6 });

但这正是 C# 语法的工作方式(Javascript 允许 JSON 定义对象而不必解析它们......C# 有不同的语法来定义内联对象 - 匿名或非 - )。


Javascript 中与您发布的示例(有一个字符串,而不是一个对象)等效的是:


const jsString = '{"test": "test"}';

console.log(JSON.stringify(JSON.parse(jsString)));

这与仅使用,有点不同JSON.stringify(),并且与您在 C# 中看到的内容相匹配(反序列化然后序列化)


另请注意,Javascript 允许定义对象的语法不一定是“严格有效的 JSON”……上面的字符串会失败:


const jsString = '{ test: "test" }';

而这种定义对象的方式是有效的:


const jsObject = { test: "test" };

(事实上,这就是您可能希望在调用时对其进行“规范化”的原因)


说了这么多

如果反序列化/序列化是“外观”中的问题,只需制作一个扩展方法......类似于:


public static string NormalizeJson(this string input) {

   return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<object>(input));

}

然后你可以在任何字符串上执行此操作(如果你using在顶部添加了):


myJsonInput.NormalizeJson();

看看它的实际效果


查看完整回答
反对 回复 2022-12-24
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我想你错过了格式化,它可能是


public static string NormalizeJson(this string value)

{

  return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<object>(value), Newtonsoft.Json.Formatting.Indented);

}


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信