Как привести в соответствие / нормализовать JSON в C #, как JSON.stringify () будет - PullRequest
0 голосов
/ 22 апреля 2019

Интересно, есть ли лучшее, менее случайное чувство, способ сделать со строками JSON то, что делает JSON.Stringify, чем это?

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

Похоже, что нет метода типа нормализуйте представление строки в противном случае в C #.Я не уверен насчет нового .NET Core 3.0 и его новых библиотек JSON.

1 Ответ

1 голос
/ 22 апреля 2019

Проблема в том, что вы сравниваете наличие 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();

Посмотреть в действии

...