Как перебрать словарь, чтобы получить и передать имя ключа в строку - PullRequest
0 голосов
/ 03 июля 2019

Я бы хотел перебрать словарь C #, хранящий вложенный JSON, для извлечения и передачи имени ключа словаря в строку в виде «ключ1: ключ1-1: ключ1-1-1».

После этого создается новый словарь для использования специально упорядоченной строки в качестве ключей.

Наконец, wantedDictionary ["key: key: key"] = originalDictionary ["key"] ["key"] ["key"].

Пожалуйста, укажите конкретный ответ, мои извинения, что я новичок в C # IEnumerable классе и JSON.

Я сохранил данные JSON в словаре, пример JSON приведен ниже.

using System.Web.Script.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

......
string jsonText = File.ReadAllText(myJsonPath);
var jss = new JavaScriptSerializer();

//this is the dictionary storing JSON
var dictJSON = jss.Deserialize<Dictionary<string, dynamic>>(jsonText); 

//this is the dictionary with keys of specially arranged string 
var desiredDict = new Dictionary<string, string>();
......
......
//Here is a sample JSON
{
    "One": "Hey",

    "Two": {
        "Two": "HeyHey"
           }

     "Three": {
        "Three": {
            "Three": "HeyHeyHey"    
                 }
              } 
}

Мне нужна помощь в процессе поиска имени ключа словаря, завершения строки и передачи нового значения словаря. В соответствии с данным JSON, wantedDict ["Three: Three: Three"] = dictJSON ["Three"] ["Three"] ["Three"] = "HeyHeyHey", Ожидается, что решение будет применяться к любому аналогичному JSON.

1 Ответ

2 голосов
/ 03 июля 2019

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

private static IDictionary<string, string> FlattenJObjectToDictionary(JObject obj)
{
    // obtain a key/value enumerable and convert it to a dictionary
    return NestedJObjectToFlatEnumerable(obj, null).ToDictionary(kv => kv.Key, kv => kv.Value);
}

private static IEnumerable<KeyValuePair<string, string>> NestedJObjectToFlatEnumerable(JObject data, string path = null)
{
    // path will be null or a value like Three:Three: (where Three:Three is the parent chain)

    // go through each property in the json object
    foreach (var kv in data.Properties())
    {
        // if the value is another jobject, we'll recursively call this method
        if (kv.Value is JObject)
        {
            var childDict = (JObject)kv.Value;

            // build the child path based on the root path and the property name
            string childPath = path != null ? string.Format("{0}{1}:", path, kv.Name) : string.Format("{0}:", kv.Name);

            // get each result from our recursive call and return it to the caller
            foreach (var resultVal in NestedJObjectToFlatEnumerable(childDict, childPath))
            {
                yield return resultVal;
            }
        }
        else if (kv.Value is JArray)
        {
            throw new NotImplementedException("Encountered unexpected JArray");
        }
        else
        {
            // this kind of assumes that all values will be convertible to string, so you might need to add handling for other value types
            yield return new KeyValuePair<string, string>(string.Format("{0}{1}", path, kv.Name), Convert.ToString(kv.Value));
        }
    }
}

Использование:

var json = "{\"One\":\"Hey\",\"Two\":{\"Two\":\"HeyHey\" },\"Three\":{\"Three\":{\"Three\":\"HeyHeyHey\"}}}";
var jObj = JsonConvert.DeserializeObject<JObject>(json);
var flattened = FlattenJObjectToDictionary(jObj);

Используется преимущество yield return для возврата результатов рекурсивного вызова в виде одного IEnumerable<KeyValuePair<string, string>>, а затем возвращает его в виде плоского словаря.

Предостережения:

  • Массивы в JSON будутвыбросить исключение (см. else if (kv.Value is JArray))
  • Часть else для обработки фактических значений предполагает, что все значения могут быть преобразованы в строку с использованием Convert.ToString(kv.Value).Если это не так, вам придется писать дополнительные сценарии.

Попробуйте онлайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...