как изменить имя поля `key` на значение ключа в словаре - PullRequest
1 голос
/ 22 февраля 2020

Я хочу изменить имя поля key на значение ключа и заменить значение поля value значением поля key.

это мой класс

public class SearchResponse 
{
    public Dictionary<string, int> Dictionary { get; set; }
}

ответ выглядит так:

{
    "key":"aaaa",
    "value":123
}

но я хочу, чтобы ответ был таким

{
    "aaaa":123
}

есть ли способ?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Вы можете проанализировать ответ в JObject, затем добавить новый токен со значениями из существующих токенов и удалить старые

var json = "{\"key\":\"aaaa\",\"value\":123}";
var jObject = JObject.Parse(json);
jObject[jObject["key"]?.ToString() ?? string.Empty] = jObject["value"];
jObject.Remove("key");
jObject.Remove("value");
Console.WriteLine(jObject);

Вывод будет следующим

{
  "aaaa": 123
}

Вы можете поместить приведенный выше код в l oop, если у вас есть несколько предметов. Затем вы можете преобразовать JObject в словарь требуемого типа, используя ToObject<T>() метод

var dict = jObject.ToObject<Dictionary<string, int>>();

Кроме того, имейте в виду, что ваш первоначальный ответ не соответствует типу Dictionary<string, int>, потому что "key":"aaaa" имеет значение string, а не int.

Другой и более общий способ c состоит в том, чтобы проанализировать json в Dictionary<string,string>, а затем добавить каждую пару значений в качестве ключа и значения в новый Dictionary<string, int>

var json = "{\"key\":\"aaaa\",\"value\":123}";
var dict = JObject.Parse(json).ToObject<Dictionary<string, string>>();

var result = new Dictionary<string, int>();
for (int i = 0; i < dict.Count; i += 2)
{
    var first = dict.ElementAt(i);
    var second = dict.ElementAt(i + 1);

    result.Add(first.Value, int.TryParse(second.Value, out int parsedValue) ? parsedValue : 0);
}
0 голосов
/ 22 февраля 2020

у вас может быть что-то вроде этого:

public Dictionary<string, string> ModelToDict<T>(T item)
    {
        Type myObjectType = item.GetType();
        Dictionary<string, string> dict = new Dictionary<string, string>();
        PropertyInfo[] properties = myObjectType.GetProperties();
        foreach (var info in properties)
        {
            string value = (string)info.GetValue(item);
            dict.Add(info.Name, value);//change the order if you like
        }
        return dict;
    }
...