.ToDictionary KeyValuePair переименовывает ключ / значение в вывод имени / значения json.net - PullRequest
0 голосов
/ 18 июня 2019

Привет всем, у меня есть следующий код, который я пытаюсь переименовать значения по умолчанию "KEY" и "VALUE" в "Имя" и «Значение» :

public class jsonOutputStyle
{
    public string Name { get; set; }
    public string Value { get; set; }
}

[Obsolete]
public string POB_CODE()
{
    Dictionary<string, string> _dicts = null;

    try
    {
        using (OracleConnection Oconn = new OracleConnection(connectionORI))
        {
           _dicts = Oconn.Query<KeyValuePair<string, string>>(
                            "SELECT " +
                                "POB_CODE AS Key," +
                                "POB_DESC AS Value " +
                            "FROM " +
                                "POB_CODE " +
                            "WHERE " +
                                "DISPLAY_SORT_ORDER >=1 " +
                            "AND " +
                                "DISPLAY_SORT_ORDER <=60",
                            null
                          )
                   .ToDictionary(pair => new jsonOutputStyle() { 
                        Name = pair.Key, 
                       Value = pair.Value
                   });
        }
    }
    catch (SqlException ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

    return JsonConvert.SerializeObject(_dicts, Formatting.None);
}

При этом возникает ошибка:

Ошибка CS0029 Не удается неявно преобразовать тип 'System.Collections.Generic.Dictionary<WCF.Service.NNicsAPI.jsonOutputStyle, System.Collections.Generic.KeyValuePair<string, string>>' в 'System.Collections.Generic.Dictionary<string, string>'

Итак, я не уверен, что все, что мне нужно сделать, чтобы исправить проблему, чтобы вывод json выглядел так:

[{"Name":"","Value":""},{"Name":"Female","Value":"F"},{"Name":"Male","Value":"M"}];

и не так:

[{"key":"","value":""},{"key":"Female","value":"F"},{"key":"Male","value":"M"}];

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Попробуйте это:

_dicts = Oconn.Query<KeyValuePair<string, string>>(
                            "SELECT " +
                                "POB_CODE AS Key," +
                                "POB_DESC AS Value " +
                            "FROM " +
                                "POB_CODE " +
                            "WHERE " +
                                "DISPLAY_SORT_ORDER >=1 " +
                            "AND " +
                                "DISPLAY_SORT_ORDER <=60",
                            null
                          )
                   .ToDictionary(pair => pair.Key, pair => pair.Value);

Я не понимаю, почему вы хотите, чтобы «Ключ» назывался «Имя». Когда словарь конвертируется в JSON, он будет выглядеть так: {"actual_value_of_key": "value"}. Вы не увидите написанную переменную Name.

РЕДАКТИРОВАТЬ: если вы хотите вывод в формате JSON, например [{"Name":"","Value":""},{"Name":"Female","Value":"F"},{"Name":"Male","Value":"M"}], не используйте словарь. Используйте ваш определенный класс.

_dicts = Oconn.Query<jsonOutputStyle>(
                            "SELECT " +
                                "POB_CODE AS Name," +
                                "POB_DESC AS Value " +
                            "FROM " +
                                "POB_CODE " +
                            "WHERE " +
                                "DISPLAY_SORT_ORDER >=1 " +
                            "AND " +
                                "DISPLAY_SORT_ORDER <=60",
                            null
                          )
                   .ToList();

Редактировать, исправлять SQL

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

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

Попробуйте:

[Obsolete]
public string POB_CODE()
{
    Dictionary<string, string> _dicts = null;

    try
    {
        using (OracleConnection Oconn = new OracleConnection(connectionORI))
        {
            _dicts = Oconn.Query<KeyValuePair<string, string>>(
                                "SELECT " +
                                    "POB_CODE AS Key," +
                                    "POB_DESC AS Value " +
                                "FROM " +
                                    "POB_CODE " +
                                "WHERE " +
                                    "DISPLAY_SORT_ORDER >=1 " +
                                "AND " +
                                    "DISPLAY_SORT_ORDER <=60",
                                null
                            )
                    .ToDictionary(p => p.Key, p => p.Value);
        }
    }
    catch (SqlException ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

    jsonOutputStyle[] styledDictionary = _dicts.Select(p => new jsonOutputStyle() { Name = p.Key, Value = p.Value }).ToArray();
    return JsonConvert.SerializeObject(styledDictionary, Formatting.None);
}

Разбивка важных изменений:

.ToDictionary(p => p.Key, p => p.Value);

вместо

.ToDictionary(pair => new jsonOutputStyle() { 
   Name = pair.Key, 
   Value = pair.Value
});

Здесь мы сначаланужно получить простой словарь с string в качестве ключа и string в качестве значения.Мы делаем это с помощью двух селекторов.Один для ключа (p => p.Key) и один для значения (p => p.Value).Нам пока не нужно беспокоиться о сериализации.

Теперь для сериализации мы не напрямую сериализуем словарь, а вместо этого приводим словарь к массиву вашего типа tupel.Это позволяет нам сериализовать имена you , определенные в этом классе, а не предварительно определенные имена свойств.

jsonOutputStyle[] styledDictionary = _dicts.Select(p => new jsonOutputStyle() { Name = p.Key, Value = p.Value }).ToArray();
return JsonConvert.SerializeObject(styledDictionary, Formatting.None);

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

Также для тех, кто интересуется, что происходит, когда вы сериализуете YourTupel[] против Dictionary<string, string> против List<KeyValuePair<string, string>>:

Serialized ArrayOfYourType:
[{"Name":"Key 0","Value":"Value 0"},{"Name":"Key 1","Value":"Value 1"}]

Serialized Dictionary:
{"Key 0":"Value 0","Key 1":"Value 1"}

Serialized List:
[{"Key":"Key 0","Value":"Value 0"},{"Key":"Key 1","Value":"Value 1"}]

РЕДАКТИРОВАТЬ:
Я предположил, что вынужен словарь (например, чтобы проверить, различны ли ключи или что-то вроде этого).Если вам вообще не нужен словарь, вы можете напрямую преобразовать массив, даже не делая каких-либо действий со словарем.

Код будет выглядеть так:
Ps.Редактирование этого ответа использует более изящные функции, чтобы сделать это еще чище, посмотрите его.

[Obsolete]
public string POB_CODE()
{
    jsonOutputStyle[] styledDictionary = null;

    try
    {
        using (OracleConnection Oconn = new OracleConnection(connectionORI))
        {
            _dicts = Oconn.Query<KeyValuePair<string, string>>(
                                "SELECT " +
                                    "POB_CODE AS Key," +
                                    "POB_DESC AS Value " +
                                "FROM " +
                                    "POB_CODE " +
                                "WHERE " +
                                    "DISPLAY_SORT_ORDER >=1 " +
                                "AND " +
                                    "DISPLAY_SORT_ORDER <=60",
                                null
                            )
                    .Select(p => new jsonOutputStyle() { Name = p.Key, Value = p.Value }).ToArray();
        }
    }
    catch (SqlException ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

    return JsonConvert.SerializeObject(styledDictionary, Formatting.None);
}
...