Проблема в том, что вы сравниваете наличие OBJECT в JS, затем конвертируете его в JSON, в STRING в C # и затем конвертируете его в 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();
Посмотреть в действии