我想知道是否有更好,更随意的方式来处理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库。
MDN Web Docs可以有一个游乐场。
在https://github.com/ethereum/wiki/wiki/JavaScript-API#web3tohex处有一个示例,其中甚至首先对相同的{test: 'test'}
JSON对象进行了字符串化,然后进行了十六进制编码。在C#中,也可能会从其他来源读取字符串,并且无论如何,输出都必须采用字符串形式。
答案 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();
答案 1 :(得分:0)
我认为您错过了格式设置,可能是
public static string NormalizeJson(this string value)
{
return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<object>(value), Newtonsoft.Json.Formatting.Indented);
}