oronsultan Ответов: 2

Сохранение HTML-тега в json без кодировки


я создаю json-файл с помощью c#. Одним из свойств является текст: "текст абзаца 1

". Когда я сохраняю файл в формате JSON, текст преобразуется в следующее: "\u003cp\текст u003eparagraph 1\u003c/Р\u003e". Я хотел бы сохранить первоначальный текст. У меня есть сущность с именем Field. Это выглядит примерно так:

public partial class Field
    {
        [JsonProperty("name")]
        public string name { get; set; }

        [JsonProperty("identifier")]
        public string identifier { get; set; }

        [JsonProperty("type")]
        public string type { get; set; }

        [JsonProperty("isEditorDialogOpen", NullValueHandling = NullValueHandling.Ignore)]
        public bool? isEditorDialogOpen { get; set; }

        [JsonProperty("paragraphHeight", NullValueHandling = NullValueHandling.Ignore)]
        public string paragraphHeight { get; set; }

        [JsonProperty("integrationID")]
        public string integrationID { get; set; }

        [JsonProperty("hint")]
        public string hint { get; set; }

        [JsonProperty("tooltip")]
        public string tooltip { get; set; }

        [JsonProperty("validations")]
        public object[] validations { get; set; }

        [JsonProperty("permission")]
        public string permission { get; set; }

        [JsonProperty("maskingViewer")]
        public string maskingViewer { get; set; }

        [JsonProperty("defaultValue")]
        public object[] defaultValue { get; set; }

        [JsonProperty("width")]
        public string width { get; set; }

        [JsonProperty("editedParagraph", NullValueHandling = NullValueHandling.Ignore)]
        public string editedParagraph { get; set; }

        [JsonProperty("label")]
        public string label { get; set; }

        [JsonProperty("stepIdx")]
        public long stepIdx { get; set; }

        [JsonProperty("blockIdx")]
        public long blockIdx { get; set; }

        [JsonProperty("rowIdx")]
        public long rowIdx { get; set; }

        [JsonProperty("readOnly", NullValueHandling = NullValueHandling.Ignore)]
        public bool? readOnly { get; set; }

        [JsonProperty("clearable", NullValueHandling = NullValueHandling.Ignore)]
        public bool? clearable { get; set; }

        [JsonProperty("required", NullValueHandling = NullValueHandling.Ignore)]
        public bool? fieldRequired { get; set; }

        [JsonProperty("maxLength", NullValueHandling = NullValueHandling.Ignore)]
        [JsonConverter(typeof(ParseStringConverter))]
        public string maxLength { get; set; }

        [JsonProperty("fieldIdx", NullValueHandling = NullValueHandling.Ignore)]
        public long? fieldIdx { get; set; }

        [JsonProperty("shownInPdfMode", NullValueHandling = NullValueHandling.Ignore)]
        public bool? shownInPdfMode { get; set; }
    }

А это и есть json:
"fields": [{
    "name": "editor.fields.paragraph",
    "identifier": "paragraph_kdg3wty6",
    "type": "paragraph",
    "isEditorDialogOpen": false,
    "paragraphHeight": "auto",
    "integrationID": "yobi1_a",
    "hint": "",
    "tooltip": "",
    "validations": [],
    "permission": "both",
    "maskingViewer": "none",
    "defaultValue": [],
    "width": "full",
    "editedParagraph": "\u003cp\u003eparagraph text 1\u003c/p\u003e",
    "label": "",
    "stepIdx": 0,
    "blockIdx": 0,
    "rowIdx": 1,
    "readOnly": null,
    "clearable": null,
    "fieldRequired": null,
    "maxLength": null,
    "fieldIdx": null,
    "shownInPdfMode": null
}]

И вот как я сохраняю этот файл:
var json = new JavaScriptSerializer().Serialize(field);
                //File.WriteAllText(destination, json);
                using (StreamWriter sw = new StreamWriter(File.Open(destination, FileMode.Create), Encoding.Unicode))
                {
                    sw.WriteLine(json);
                }

Я попытался сохранить файл в виде текста в любом формате кодировки, но безуспешно.

Что я уже пробовал:

Я попытался сохранить файл в виде текста в любом формате кодировки, но безуспешно.

2 Ответов

Рейтинг:
14

OriginalGriff

Когда я попробую это сделать:

string s = "\u003cp\u003eparagraph text 1\u003c/p\u003e";
string x = "<p>paragraph text 1</p>";
string json1 = JsonConvert.SerializeObject(s);
string json2 = JsonConvert.SerializeObject(x);
Я вам вполне нормально JSON из обеих строк:
"<p>paragraph text 1</p>"
Даже если я предполагаю, что ваша строка является литералом:
string s = @"\u003cp\u003eparagraph text 1\u003c/p\u003e";
string json1 = JsonConvert.SerializeObject(s);
Тогда я все равно получаю именно то, что ожидаю
как JSON:
"\\u003cp\\u003eparagraph text 1\\u003c/p\\u003e"
Так как '\' является специальным символом JSON и должен быть экранирован.

Так... Я бы внимательно посмотрел на код, который генерирует ваш JSON, и данные, с которыми он работает, - я бы заподозрил, что ваша строка "editedParagraph" происходит с какой-то формой кодировки HTML, так что именно поэтому вы получаете символы unicode в своих выходных данных.

Используйте отладчик и внимательно посмотрите на то, что происходит.


oronsultan

дорогой друг,
Большое вам спасибо за Ваш быстрый ответ.
Пожалуйста, это сверло вниз:
Во-первых, я создаю сущность "поле":
Поле f = новое поле();
Затем я инициализирую свойства. Один из них называется "editedParagraph":
f1.editedParagraph = "текст абзаца 1";
После завершения инициализации всех свойств я сохраняю сущность в виде файла json:
строка назначения = "c:\\...\Output.Json"
var json = новый JavaScriptSerializer().Serialize(f);
Файл.WriteAllText(destination, json);
Мне нужно, чтобы 'editedParagraph' был сохранен как 'paragraph text 1', а не '"\\u003cp\\u003eparagraph text 1\\u003c/p\\u003e"'

OriginalGriff

Тогда не используйте JavaScriptSerializer!
Он предназначен для этого: "< " и "> " - это значимые символы в HTML, от которых зависит Javascript, поэтому он предназначен для замены их символьными представлениями Unicode, чтобы строка могла передаваться с сервера на клиентский Javascript через HTML. Если бы он не заменил их, они - и данные между ними - были бы "проглочены" HTML-рендером браузера, прежде чем JS смог бы приблизиться к ним!

Если вы не хотите разговаривать с JS, используйте NewtonSoft или аналогичный инструмент для создания "generic" JSON вместо JS specific JSON.

Рейтинг:
10

oronsultan

OriginalGriff,
Большое вам спасибо за то, что обратили мое внимание на эту проблему. Кажется, все это время я гонялся за собственным хвостом.
Вместо использования

JavaScriptSerializer
, Я сделал это, и теперь это работает нормально:
var json = Newtonsoft.Json.JsonConvert.SerializeObject(main);
File.WriteAllText(destination, json);


Одна важная вещь:
У меня есть метод переопределения для
WriteJson
(наследовать
JsonConverter
класс)
и мне пришлось его модифицировать:
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            var value = (DefaultValue)untypedValue;
            if (value.Bool != null)
            {
                serializer.Serialize(writer, value.Bool.Value);
                return;
            }
            if (value.String != null)
            {
                serializer.Serialize(writer, value.String);
                return;
            }
            throw new Exception("Cannot marshal type DefaultValue");
        }