Лучший способ вставить тип данных в полезную нагрузку json при использовании rest api вставки данных в хранилище таблиц Azure - PullRequest
0 голосов
/ 14 июня 2019

Когда я использую хранилище таблиц Azure Вставить сущность api для вставки данных.

В моем классе сущностей есть несколько типов, таких как dateTime, int.И в соответствии с этим doc : по умолчанию свойство создается как тип String, если вы не укажете другой тип.

Так что мне интересно, какой из способов является лучшим для добавления типа одататы вJSON полезная нагрузка?Сгенерированная полезная нагрузка json с добавленным типом данных должна выглядеть следующим образом:

enter image description here

И мое текущее решение состоит в том, что после генерации строки json я рассматриваю ее какстрока и добавьте тип odata непосредственно в json.Но я думаю, что должен быть более лучший способ для этого.

Мой код, как показано ниже:

Класс сущности:

public class MyClass
{

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }

    public Guid TestId { get; set; }
}

Основной метод:

        static void Main(string[] args)
        {

            string url_with_sasToken = "https://xxx.table.core.windows.net/ttt?sasToken";

            MyClass entity = new MyClass
            {
                PartitionKey = "ivan2",
                RowKey = "y1",
                Name = "jack60",
                TestId = Guid.NewGuid()
            };

            //here, I add the odata type for Guid type
            string s = JsonConvert.SerializeObject(entity).Replace("}","");
            s += ",\"TestId@odata.type\"" + ":" + "\"Edm.Guid\"}";
            Console.WriteLine(s);

            var content = new StringContent(s, Encoding.UTF8, "application/json");

            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new
          MediaTypeWithQualityHeaderValue("application/json"));
                var t2 = client.PostAsync(url_with_sasToken , content).GetAwaiter().GetResult();
                Console.WriteLine(t2.StatusCode);
            }

        }

1 Ответ

1 голос
/ 14 июня 2019

ИМХО, лучший способ сделать это - использовать Reflection и динамически создавать JSON, перебирая открытые свойства класса. Вы можете выбрать только те свойства, типы которых поддерживаются службой таблиц (например, Guid, DateTime и т. Д.)

Таким образом, вы не будете постоянно изменять код сериализации для отражения изменений в определении вашего класса. В любом случае использование знака + для конкатенации строк - плохая идея:).

Для справки, вы можете взглянуть на код класса TableEntity в Storage SDK. Я загрузил код для выпуска 9.3.2 с Github (https://github.com/Azure/azure-storage-net/releases/tag/v9.3.2), поскольку это была последняя версия, которая поддерживала Table в SDK.

...