Stop System.text.json с изменением структуры JSONC#

Место общения программистов C#
Ответить
Anonymous
 Stop System.text.json с изменением структуры JSON

Сообщение Anonymous »

При анализе JSON он превращается в совершенно непригодные данные, с которыми я не могу работать. Несмотря на многочисленные попытки, полученные данные либо умен, либо неправильно отформатированы, когда я пытаюсь десериализировать и сохранить их обратно в файл. Глобальные переменные (такие как достижения) и объект с множеством сейвов. Каждое сохранение включает в себя вложенную строку JSON в поле Savedata. Моя цель состоит в том, чтобы проанализировать и изменить эти данные JSON при сохранении своей структуры, особенно при повторном заезде обратно в файл.
// Load save file into variable
fileContent = System.IO.File.ReadAllText(filePath);

// Parse JSON into a JsonDocument
savefileData = JsonNode.Parse(fileContent);
savefileDataRoot = savefileData;

...

// Deserialize the saves array
JsonArray? savesArray = savefileDataRoot["saves"] as JsonArray;

if (savesArray != null)
{
foreach (JsonNode? save in savesArray)
{
if (save?["slot"] is JsonValue slotValue && slotValue.TryGetValue(out int slotNumber) && slotNumber == selectedSaveFile)
{
savefileRoot = save; // Store the matching save entry

if (save["savedata"] is JsonValue savedataValue && savedataValue.TryGetValue(out string newRawJson))
{
savedataObject = JsonNode.Parse(newRawJson); // Deserialize the JSON string inside "savedata"
Console.WriteLine(savedataObject); // Here, the JSON is messed up already
}

break;
}
}
}

// Ensure savedataObject is treated as a proper JSON object, not a stringified JSON
if (savedataObject is JsonValue savedataText && savedataText.TryGetValue(out string newerRawJson))
{
if (!string.IsNullOrEmpty(newerRawJson) && newerRawJson.StartsWith("{"))
{
savedataObject = JsonNode.Parse(newerRawJson);
}
}
< /code>
json должен выглядеть так: < /p>
...
\"specialValues\": [\r\n \"RFU8547638325336\",\r\n \"{\\\"Id\\\":{\\\"TableReference\\\":\\\"Other\\\",\\\"TableEntryReferenceLong\\\":0,\\\"TableEntryReference\\\":\\\"Sender_BigDaddyHurt\\\"},\\\"ReplacementValue\\\":\\\"\\\"}\"\r\n ]\r\n },\r\n {\r\n \"read\": true,\r\n \"visibleAt\": 0,\r\n \"onReadEventHolder\": {\r\n \"data\": \"\",\r\n \"eventEnum\": 0\r\n },\r\n \"emailId\": \"FedUpConsolidation\",\r\n \"specialValues\": [\r\n \"WAL7194198375742\"
...
{\"name\":\"diarrheaHappened\",\"timeAdded\":30759,\"firstTimeAdded\":30759,\"times\":1},{\"name\":\"StreamStarted\",\"timeAdded\":30759,\"firstTimeAdded\":30759,\"times\":1},{\"name\":\"afterprologue\",\"timeAdded\":30759,\"firstTimeAdded\":30759,\"times\":1},{\"name\":\"LandlordEvent\",\"timeAdded\":30760,\"firstTimeAdded\":30760,\"times\":2}],\"search\":0.0,\"priestBotPoints\":0,\"nunPoints\":0,\"weeklyRent\":800,\"money\":22554518,\"casinoTokens\":202178,
...
< /code>
Однако при записи в файл выглядит следующим образом: < /p>
...
{
"name": "diarrheaHappened",
"timeAdded": 12479,
"firstTimeAdded": 12479,
"times": 1
},
{
"name": "cards",
"timeAdded": 13773,
"firstTimeAdded": 13773,
"times": 1
},
{
"name": "pets1",
"timeAdded": 13813,
"firstTimeAdded": 13813,
"times": 1
}
],
"search": 0,
"priestBotPoints": 0,
"nunPoints": 0,
"weeklyRent": 800,
"money": 12345,
"casinoTokens": 200122
< /code>
Что я пробовал: < /p>

Обширные исследования, включая другие сообщения Stackoverflow. < /li>
Попытка решений из Chatgpt и Copilot. < /li>
Настройка различных частей процесса десериализации и сериализации. < /li>
< /ul>
Сегодня я работаю над этим около 14 часов, и проблема сохраняется. Данные не сохраняют ожидаемый формат при десериализованном и переоснащении, и независимо от того, что я пытаюсь, строка SaveData либо повреждена, либо потеряна. < /P>
Пожалуйста, помогите мне понять, что идет не так. С помощью этой логики анализа и, если возможно, предоставьте решение, которое поддерживает исходную структуру JSON при сохранении обратно. Я бы предпочел не переходить на Newtonsoft.json, если это не будет , так как это значительно увеличило бы окончательный размер моей программы.


Подробнее здесь: https://stackoverflow.com/questions/794 ... -structure
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»