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

时间:2019-04-21 22:42:37

标签: c# .net-core .net-core-3.0

我想知道是否有更好,更随意的方式来处理JSON字符串,JSON.Stringify比这更有用吗?

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

在C#中,似乎没有一种方法可以 normalize 字符串表示形式。我不确定新的.NET Core 3.0及其新的JSON库。

JSON.stringify到Java字符串的所有输入(无论是对象表示法还是已字符串化)都存在互操作性。所以我想知道是否有一种更好的处理方法,就像我指出的那样。如果已经内置到框架中,那就更好了。

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

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3tohex处有一个示例,其中甚至首先对相同的{test: 'test'} JSON对象进行了字符串化,然后进行了十六进制编码。在C#中,也可能会从其他来源读取字符串,并且无论如何,输出都必须采用字符串形式。

2 个答案:

答案 0 :(得分:1)

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

如果您有C#对象,则与JSON.stringify()等效的只是JsonConvert.SerializeObject(myObject)。 C#不像JS那样接受JSON语法来定义对象。

在您发布的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() just 有点不同,并且与您在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();

See it in action

答案 1 :(得分:0)

我认为您错过了格式设置,可能是

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