如何在 C# 中 stringify/normalize json 像 JSON.stringify() 会

How to stringify/normalize json in C# like JSON.stringify() would

我想知道是否有比 JSON.Stringify 对 JSON 字符串更好、更不随意的感觉的方法?

string json = "{test: 'test'}";
var stringified = JsonConvert.SerializeObject(JsonConvert.DeserializeObject<dynamic>(json));
Console.WriteLine(stringified); //Prints {"test":"test"}

似乎在 C# 中没有 规范化 字符串表示的方法。我不确定新的 .NET Core 3.0 及其新的 JSON 库。

JSON.stringify 所有输入到 Javascript 字符串的互操作情况,无论是对象表示法还是已经字符串化。所以我想知道是否有比我提到的更好的处理方法。如果已经内置到框架中就更好了。

MDN Web Docs可以有一个游乐场。

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3tohex 中有一个示例,其中看起来甚至是相同的 {test: 'test'} JSON 对象首先被字符串化,然后进行 HEX 编码。在 C# 中也可能存在从其他来源读取字符串并且无论如何输出都需要采用字符串化形式的情况。

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

如果你有一个 C# 对象,JSON.stringify() 的等价物就是 JsonConvert.SerializeObject(myObject)。 C# 不接受 JSON 语法(就像 JS 一样)来定义对象。

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

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

C# 等价物是 (run it):

 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 不一定是 "strict valid JSON"...上面的字符串会失败:

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

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

const jsObject = { test: "test" };

(事实上,这就是您可能想要 "normalize" 它的原因)


综上所述

如果 deserializing/serializing 是 "looks" 中的问题,只需制作一个扩展方法...类似于:

public static string NormalizeJson(this string input) {
   return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<object>(input));
}

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

myJsonInput.NormalizeJson();

See it in action

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

public static string NormalizeJson(this string value)
{
  return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<object>(value), Newtonsoft.Json.Formatting.Indented);
}