C#: Как использовать скобки в кавычках в json? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть этот json -файл:

{
    "TestString": "This is a \"{Test}\""
}

Если он не существует, я автоматически сгенерирую его.

Например, это C# -код , где я использую строку напрямую:

class Programm
{
    static void Main()
    {
        string s = "{ \"TestString\": \"This is a \"{test}\"\"}";

        Test test = JsonConvert.DeserializeObject<Test>(s);
    }
}

Теперь проблема в том, что строка не работает таким образом, потому что C# сделает кавычки буквальными, а затем сохранит их в string s , в результате получается

"{ "TestString": "This is a "{test}""}"

, что является ошибочной json -строкой, потому что кавычки не экранируются.

static void Main()
{
    string s = @"{ ""TestString"": ""This is a ""{test}""""}";

    Test test = JsonConvert.DeserializeObject<Test>(s);
}

Преобразование всей строки в литерал приводит к тому же.

Я что-то упускаю?

Ответы [ 5 ]

2 голосов
/ 05 мая 2020

\"{test}\" добавляет экранированные кавычки, поэтому C# не завершает строку, но нарушает JSON. Чтобы избежать кавычек в JSON, вам нужно будет добавить экранированный back-sla sh \\, а JSON должно быть:

string s = "{ \"TestString\": \"This is a \\\"{test}\\\"\"}";

Лучший способ сгенерировать правильный JSON предназначен для сериализации анонимных объектов (если у вас нет подходящих моделей.

var model = new { TestString = "This is a \"{test}\""};
string s = JsonConvert.SerializeObject(model);
Test test = JsonConvert.DeserializeObject<Test>(s);

ПРИМЕЧАНИЕ: Вы также можете использовать дословную строку

С дословными строками a sla sh, это просто sla sh и не является escape-символом. Чтобы вставить кавычки, используйте двойные двойные кавычки (""). Новые строки также сохраняются, что позволяет легко создавать многострочные строки без каких-либо сочетание символов возврата каретки (\r) и перевода строки (\n). Их может часто легче читать - обратите внимание на последовательность из 4 двойных кавычек в конце строки.

    string s = @"{ ""TestString"": ""This is a \""{test}\""""}";
1 голос
/ 05 мая 2020

Если вы хотите создать файл Json, ваш первый go должен использовать сериализацию объекта. Это устранит необходимость экранирования символа в строковой переменной.

//// Using an Object as input
var data = new Foo { TestString = "This is a \"{Test}\""};  
var json = JsonConvert.SerializeObject(data);
var result = JsonConvert.DeserializeObject<Foo>(json);
result.Dump();      



File.WriteAllText("tempFile.txt", json);
////Using a txtFile
var inputFile = File.ReadAllText("tempFile.txt");
var resultFile = JsonConvert.DeserializeObject<Foo>(inputFile);
resultFile.Dump();

Для дословной строки начинайте с ожидаемой строки: "TestString": "This is a \"{Test}\""
И добавьте DQuote перед каждым DQuote => ""TestString"":""This is a \""{Test}\""""

////Using a string verbatim @
var inputVerbatim  = @"{""TestString"":""This is a \""{Test}\""""}";
var resultVerbatim = JsonConvert.DeserializeObject<Foo>(inputVerbatim);
resultVerbatim.Dump();

Для простой строки вы должны экранировать каждый специальный символ с помощью \.
"TestString": "This is a \"{Test}\""
=> \"TestString\":\"This is a \\\"{Test}\\\"\"

////Using a simple string 
var inputString = "{\"TestString\":\"This is a \\\"{Test}\\\"\"}";
var resultString = JsonConvert.DeserializeObject<Foo>(inputString);
resultString.Dump();

LiveDemo

0 голосов
/ 05 мая 2020

\ "используется C# для выхода из кавычек, а также JSON. Это означает, что:

Если вы поместите этот действительный текст JSON в файл:

{ 
    "TestString": "This is a \"{test}\""
}

И прочтите это так:

    string res = File.ReadAllText(@"c:\data\test.json");
    var t1 = JsonConvert.DeserializeObject<Test>(res);

Тогда это будет то же самое, что ввести текст непосредственно в строку следующим образом:

    string res2 = "{ \"TestString\": \"This is a \"{test}\"\"}";
    var t2 = JsonConvert.DeserializeObject<Test>(res);

И оба будут даст вам результат

Это "{test}"

0 голосов
/ 05 мая 2020

Проблема в том, что кавычки вокруг {test} не экранируются должным образом. Попробуйте:

string s = "{ \"TestString\": \"This is a \\\"{test}\\\"\"}";
0 голосов
/ 05 мая 2020

Если я правильно понял ваш вопрос, вы просто хотите добавить какой-нибудь специальный символ в строку JSON. Просто добавьте их так:

\" 

или для Backsla sh:

\\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...