Размещение словаря в. net core 3.1. API - PullRequest
0 голосов
/ 18 июня 2020

Я хочу опубликовать следующий DTO в. NET Core API:

{
    "Name": "Foo",
    "Street": "Bar",
    "DynamicInfo": {
        "MetadataAsString": "23423",
        "MetadataAsInt": 2,
        "MetadataAsBool": true,
        "SomeOtherValues": "blub"
    }
}

Класс, который я хочу отобразить в C#, выглядит следующим образом:

public class Foo
{
    public string Name { get; set; }
    public string Street { get; set; }
    public Dictionary<string, object> DynamicInfo { get; set; }
}

Вы можете видеть, что я использую два свойства c (имя и улица), но я также хочу опубликовать некоторые динамические c данные.
Я ожидаю, что динамические c данные будут записаны в словарь, но, к сожалению, это не работает.
Результат, который я получаю в моем отладчике, немного сбивает с толку:

enter image description here

Значения прибывают успешно, но в странном формате ... Я даже не знаю, как получить доступ к значениям.
Как мне преобразовать это в обычный словарь, содержащий объекты?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Я нашел решение. Результирующий объект (ValueKind = String: 23423) представляет собой не что иное, как JSONElement. Я не понимал этого раньше.
У этого JSONElement есть перечисление, которое сообщает мне, какой тип данных у меня есть, поэтому я могу использовать его для сопоставления моего словаря JSONElements с другим словарем «реальных» объектов.

var newDic = new Dictionary<string, object>();
            foreach (var d in obj.DynamicInfo)
            {
                object obt;
                string key = d.Key;
                var a = enterprise.BasicInformation.TryGetValue(key, out obt);
                if (obt == null) continue;
                var doc = (JsonElement)obt;

                string myString = null;
                bool? myBool = null;
                int? myInteger = null;
                double? myFloatNumber = null;
                if (doc.ValueKind == JsonValueKind.String)
                {
                    myString = doc.ToString();
                }

                if (doc.ValueKind == JsonValueKind.True)
                {
                    myBool = true;
                }
                if (doc.ValueKind == JsonValueKind.False)
                {
                    myBool = false;
                }
                if (doc.ValueKind == JsonValueKind.Number)
                {
                    double floatNumber;
                    doc.TryGetDouble(out floatNumber);
                    if ((floatNumber % 1) == 0)
                    {
                        myInteger = (int)floatNumber;
                    }
                    else
                    {
                        myFloatNumber = floatNumber;
                    }
                }
                if (myString != null)
                {
                    newDic.Add(key, myString);
                }
                if (myBool != null)
                {
                    newDic.Add(key, myBool);
                }
                if (myInteger != null)
                {
                    newDic.Add(key, myInteger);
                }
                if (myFloatNumber != null)
                {
                    newDic.Add(key, myFloatNumber);
                }
            }

Код может быть не идеальным - я постараюсь его оптимизировать. Но он делает то, что должен.

0 голосов
/ 18 июня 2020

Для решения, которое не зависит от вашего варианта использования, я бы использовал 2 объекта. 1 для ввода клиента и 1 для подтвержденного ввода. Объект ввода клиента будет содержать Dictionary<string,string>. И проверенный ввод может содержать ваш Dictionary<string,object>, если вы все еще собираетесь его использовать.

Если вы используете этот подход. Во время проверки ввода клиента вы можете использовать bool.TryParse(DynamicInfo["MetadataAsBool"], out YourBoolean). Затем просто добавьте YourBoolean к вашему новому Dictionary<string,object> objectDictionary, например objectDictionary.Add("BoolMetadata", YourBoolean)

...