Динамический класс C # - как сохранить имя переменной из сериализованного вывода - PullRequest
0 голосов
/ 14 апреля 2019

Имя переменной с префиксом @ изменилось после сериализации из-за именования C #.Как это предотвратить?

//assignment of object value with @Timestamp

List<dynamic> Documents = new List<dynamic>();
Documents.Add( new { Index = ""index-name-test", Type = "doc", Id = g.ToString(),
    Title = "title1", @Timestamp = DateTime.UtcNow });

foreach (var doc in Documents)
{
    var json = JsonConvert.SerializeObject(new { Documents= doc });           
}

как и в значении json, оно содержит

"{\"Documents\":{\"Index\":\"index-name-test*\",\"Type\":\"doc\",\"Id\":\"76134434-2ed0-48df-9034-841b386a0dbc\",\"Title\":\"title1\",\"Timestamp\":\"2019-04-14T15:50:33.596931Z\"}}"

{"Documents": {"Index": "index-name-test* " "Тип": "документ", "Id": "76134434-2ed0-48df-9034-841b386a0dbc", "Название": "title1", "Отметка":" 2019-04-14T15: 50: 33.596931Z"}}

Как сделать, чтобы отметка времени стала @Timestamp?

1 Ответ

0 голосов
/ 14 апреля 2019

В C # префикс имени переменной с @ - это просто способ использовать зарезервированные слова в качестве имен переменных. Например, вы можете сделать это:

var @class = "foo";

Если вы не используете @, вы получите ошибку компилятора. Таким образом, при сериализации динамических объектов имя переменной все еще равно Timestamp. Лучшим вариантом будет использовать конкретный класс для хранения ваших данных. Вы можете не только управлять именами при сериализации, но и получать безопасность типа времени компиляции, и это намного быстрее, чем использование dynamic (каждый раз, когда вы используете dynamic, котенок умирает!)

Итак, я бы создал два класса, подобных этому:

//Root class so you don't need to serialise an anonymous type and can easily deserialise later
public class Root
{
    public List<Document> Documents { get; set; }
}

public class Document
{
    public string Index { get; set; }
    public string Type { get; set; }
    public string Id { get; set; }
    public string Title { get; set; }

    //This attribute controls the JSON property name
    [JsonProperty("@Timestamp")]
    public string Timestamp { get; set; }

}

И сериализовать что-то вроде этого:

var root = new Documents();

root.Documents = new List<Document>
{
    new Document
    {
        Index = ""index-name-test", 
        Type = "doc", 
        Id = g.ToString(),
        Title = "title1",
        Timestamp = DateTime.UtcNow
    }
};

var json = JsonConvert.SerializeObject(root);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...