2015-04-15 3 views
2

Как я могу получить значение определенного вложенного свойства из объекта JSON во время выполнения? Вот пример того, что ilustrates, что я пытаюсь сделать (без проверки ошибок, потому что это просто быстрый пример):Newtonsoft JSON получает определенное вложенное свойство во время выполнения

JSON объекта:

string jsonobj = "{ 
    "Header":"someHeader", 
    "FirstNest":{ 
     "Property1":"123", 
     "property2":"321", 
     "SecondNest":{ 
      "property3":"456", 
      "property4":"789" 
     } 
    } 

В моем коде, я бы что-то вроде этого :

string read = Console.ReadLine();

, где пользователь будет вводить, например FirstNest.Property1, а потом я вернусь 123. Я мог бы сделать что-то вроде этого:

JObject msg = JObject.Parse(jsonobj); 
string[] tosearch = read.Split('.'); // This would give me FirstNest Property1 
string tofind = (string)msg[tosearch[0]][tosearch[1]]; 

Проблема возникает, когда пользователь хочет получить доступ к FirstNest.SecondNest.property3, потому что мой жесткий кодировкой метод может принимать только две строки. Как я могу создать такой метод запроса во время выполнения, с помощью которого я мог бы позволить пользователю искать любое свойство? Один soultion было бы сделать функцию

GetProperty(JObject msg, string str1, string str2) 
{ 
    return (string)msg[str1][str2]; 
} 

потом еще один, который будет принимать 3 строки в качестве входных данных:

GetProperty(JObject msg, string str1, string str2, string str3) 
{ 
    return (string)msg[str1][str2][str3]; 
} 

, потом еще один, который будет принимать 4 строки в качестве входных данных, и так на ... который не кажется эффективным решением.

+2

Я думаю, что ['SelectToken'] (http://www.newtonsoft.com/json/help/html/SelectToken.htm) уже делает то, что вы хотите, не так ли? – dbc

+0

@dbc. Вы правы, это лучшее решение проблемы (хотя и работает решение Джейсона Бойда). Благодаря! –

ответ

4

Как об этом (обработка исключений исключенного для краткости):

public string GetJsonPropertyValue(string json, string query) 
{ 
    JToken token = JObject.Parse(json); 

    foreach(string queryComponent in query.Split('.')) 
    { 
     token = token[queryComponent]; 
    } 
    return token.ToString(); 
} 

Учитывая JSON в вашем примере поиск этого FirstNest.SecondNest.property3 вернет 456. Вы должны включить любую необходимую проверку входных данных и обработку исключений.

+0

Спасибо, это работает! Возможно, у вас есть идея, как я могу получить доступ к массивам с индексами? –

+0

Хорошо, я нашел решение для чисел тоже: 'int n; bool isNumber = int.TryParse (queryComponent, out n); if (isNumber) { token = токен [n]; } else { token = токен [queryComponent]; } ' –

Смежные вопросы