2 回答
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();
TA贡献1895条经验 获得超7个赞
我想你错过了格式化,它可能是
public static string NormalizeJson(this string value)
{
return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<object>(value), Newtonsoft.Json.Formatting.Indented);
}
- 2 回答
- 0 关注
- 151 浏览
添加回答
举报