Json.NET: Как заставить пре-форматированное JSON свойство сериализовать "as-is"?
От: Yuri Abele Германия yabele.blogspot.com
Дата: 19.10.20 10:08
Оценка:
Всем привет!

Есть в MSSQL табличка для хранения истории пользователя.
Туда "падает" все события вокруг пользователя, как то, что он делал (login, logout & ETC),
так и то, что с ним делали (например у него сменился адрес или привязка к роли).
Табличка содержит как несколько "строгих" полей — [дата события], [тип события], [идентификатор пользователя],
так и одно поле в формате JSON, которое содержит важную именно для этого [типа события] информацию.
В Backend (пока на NancyFX, но в планах миграция на .NET 5 WebAPI), при запросе к базе данных,
вытаскиваются данные в соотв. модель, где JSON-отформатированное поле, попадает в строковое свойство класса.

Вопрос:
Можно ли заставить Json.NET сериализовать эту модель так, чтобы JSON-свойство класса, в итоговый JSON попадало "as-is",
и порождался один большой, композитный JSON?
Re: Json.NET: Как заставить пре-форматированное JSON свойств
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.10.20 10:29
Оценка: 2 (1)
Здравствуйте, Yuri Abele, Вы писали:

https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm
https://docs.microsoft.com/ru-ru/dotnet/standard/serialization/system-text-json-converters-how-to#support-polymorphic-deserialization
Не это?
и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.10.2020 10:43 Serginio1 . Предыдущая версия .
Re: Json.NET: Как заставить пре-форматированное JSON свойство сериализовать "as-
От: rameel https://github.com/rsdn/CodeJam
Дата: 19.10.20 11:11
Оценка: 8 (2) +2
Здравствуйте, Yuri Abele, Вы писали:

YA>Вопрос:

YA>Можно ли заставить Json.NET сериализовать эту модель так, чтобы JSON-свойство класса, в итоговый JSON попадало "as-is",
YA>и порождался один большой, композитный JSON?

Можно использовать JRaw

public class User
{
    public string Name { get; set; }
    public JRaw Data { get; set; }
}

var user = new User
{
    Name = "user",
    Data = new JRaw("{\"anonymous\": true}")
};

var s = JsonConvert.SerializeObject(user);
Console.WriteLine(s); // {"Name":"user","Data":{"anonymous": true}}


Если же хочется использовать string, то пишете нужный JsonConverter и навешиваете в виде атрибута на свойство
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: Json.NET: Как заставить пре-форматированное JSON свойство сериализовать "
От: Yuri Abele Германия yabele.blogspot.com
Дата: 19.10.20 11:33
Оценка:
Здравствуйте, rameel, Вы писали:

R>Можно использовать JRaw

Да, это оно, то, что надо!

R>Если же хочется использовать string, то пишете нужный JsonConverter и навешиваете в виде атрибута на свойство

Да не, так устроит:

[JsonIgnore]
public string Message { private get; set; }

public JRaw Data => this.Message == null ? new JRaw(this.Message) : null;
Re[3]: Json.NET: Как заставить пре-форматированное JSON свойство сериализовать "
От: yenik  
Дата: 20.10.20 10:27
Оценка: +1
YA>
YA>[JsonIgnore]
YA>public string Message { private get; set; }

YA>public JRaw Data => this.Message == null ? new JRaw(this.Message) : null;
YA>


this.Message == null ? new JRaw(this.Message) — что-то тут не так
Re[4]: Json.NET: Как заставить пре-форматированное JSON свойство сериализовать "
От: Yuri Abele Германия yabele.blogspot.com
Дата: 26.10.20 10:20
Оценка:
Y>this.Message == null ? new JRaw(this.Message) — что-то тут не так
Да, я уже сам заметил , спасибо!

Тут другая хрень какая-то! Поле Message часто бывает равное NULL.
Как мне сказать этому JRaw, чтобы он в этом случае рендерил null в результирующем JSON?

Что в таком случае:
public JRaw Data => new JRaw(this.Message);


что в таком
public JRaw Data => this.Message == null ? null : new JRaw(this.Message);


получается (если message=null) вот такая не JSON-Well-Formed фигня:
{
    "eventSource": "SE",
    "loggedAt": "2020-10-20 05:40:41",
    "currentUserEmail": null,
    "currentUserFirstName": null,
    "currentUserLastName": null,
    "event": 4010,
    "data": 
}

после "data" просто дырка! А должно стоять
"data": null
c# json jraw
Re[5]: Json.NET: Как заставить пре-форматированное JSON свойство сериализовать "
От: Yuri Abele Германия yabele.blogspot.com
Дата: 26.10.20 10:41
Оценка:
Волшебным образом, вот этот вариант отдохнул на выходных и заработал :
public JRaw Data => this.Message == null ? null : new JRaw(this.Message);


Но вот это так и не работает:
public JRaw Data => new JRaw(this.Message);


Экземпляр JRaw от NULL значения рендерится в ничто!
Re[6]: Json.NET: Как заставить пре-форматированное JSON свойство сериализовать "
От: Yuri Abele Германия yabele.blogspot.com
Дата: 26.10.20 10:55
Оценка: 6 (1)
Здравствуйте, Yuri Abele, Вы писали:

YA>Волшебным образом, вот этот вариант отдохнул на выходных и заработал :

YA>
YA>public JRaw Data => this.Message == null ? null : new JRaw(this.Message);
YA>


YA>Но вот это так и не работает:

YA>
YA>public JRaw Data => new JRaw(this.Message);
YA>


YA>Экземпляр JRaw от NULL значения рендерится в ничто!


если я вам еще не надоел, то вот два корректных варианта:

public JRaw Data => this.Message == null ? null : new JRaw(this.Message);


Или, если необходим экземпляр JRaw, то вот так правильно:
public JRaw Data => new JRaw(this.Message  ?? "null");
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.