2015-12-25 2 views
1

В моем приложении у меня есть List<Users>десериализации JSON с вложенными массивами для создания строки из значений

[{ 
"Id": "1", 
"Name": "last, first", 
"Skills": [{"SN":"20","SL":"12"},{"SN":"197","SL":"09"}] 
}, 
{ 
"Id": "2", 
"Name": "Black, Jack", 
"Skills": [{"SN":"40","SL":"07"},{"SN":"199","SL":"05"}] 
}, 
{ 
"Id": "3", 
"Name": "Rooney, Wayne", 
"Skills": [{"SN":"40","SL":"11"},{"SN":"201","SL":"07"}] 
}] 

Мне нужно преобразовать эти данные в одну строку в формате, как это:

"1/последняя, ​​первая/20-12,197-09; 2/Черный Джек/40-07,199-05; 3/Rooney, Wayne/40-11,201-07"

Я попытался сериализовать этот OBJE кт получить JSON строку:

public IHttpActionResult ImportUsers([FromBody]IEnumerable<Users> newUsers) 
{ 
    string agents = JsonConvert.SerializeObject(newUsers); 
    return Ok(agents); 
} 

и получить результат:

"[{\" Id \ ": \" 1 \ "\ "Имя \": \" последний, first \ ", \" Skills \ ": [{\" SN \ ": \" 20 \ ", \" SL \ ": \" 12 \ "}, {\" SN \ ": \" 197 \ " , \ "SL \": \ "09 \"}]}, {\ "Id \": \ "2 \", \ "Name \": \ "Black, Jack \", \ "Skills \": [{\ "С.Н. \": \ "40 \", \ "SL \": \ "07 \"}, {\ "С.Н. \": \ "199 \", \ "SL \": \ "05 \ "}]}, {\" Id \ ": \" 3 \ ", \" Name \ ": \" Rooney, Wayne \ ", \" Skills \ ": [{\" SN \ ": \" 40 \ ", \" SL \ ": \" 11 \ "}, {\" SN \ ": \" 201 \ ", \" SL \ ": \" 07 \ "}]}]"

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

var dict = JsonConvert.DeserializeObject<dynamic>(agents); 
      List<string> results = new List<string>(); 
      foreach (var d in dict) 
      {     
       var skills = d["Skills"];     
       string skill = string.Join(",", skills); 
       string list = d["Id"] + "/" + d["Name"] + "/" + skill; 
       results.Add(list); 
      } 
      string result = string.Join(";", results); 

и получить эту строку:

"1/последние, первый/{\ г \ п \" SN \ ": \" 20 \ ", \ r \ n \" SL \ ": \" 12 \ "\ r \ n}, {\ r \ n \" SN \ ": \" 197 \ ", \ r \ n \ "SL \": \ "09 \" \ r \ n}; 2/Black, Jack/{\ r \ n \ "SN \": \ "40 \", \ r \ n \ "SL \ ": \" 07 \ "\ r \ n}, {\ r \ n \" SN \ ": \" 199 \ ", \ r \ n \" SL \ ": \" 05 \ "\ r \ n }; 3/Руни, Уэйн/{\ r \ n \ "SN \": \ "40 \", \ r \ n \ "SL \": \ "11 \" \ r \ n}, {\ r \ n \ "SN \": \ "201 \", \ r \ n \ "SL \": \ "07 \" \ r \ n} "

Так что это больше похоже на то, что мне нужно, но у меня все еще есть проблема со значениями в списке Skills. Как я могу получать значения от него, как это было с столбцами Id и Name? Может быть, мне нужно снова десериализовать эту часть или использовать некоторые регулярные выражения для достижения нужной мне строки?

ответ

1

Ваш ожидаемый результат недействительный json. Тогда лучший способ - форматировать строку результата через C# без сторонних библиотек.

Лаконичный способ заключается в использовании строки functiions:

public IHttpActionResult ImportUsers([FromBody] IEnumerable<User> newUsers) 
{ 
    var agents = string.Join(";", newUsers.Select(GetFormattedUserString)); 
    return Ok(agents); 
} 

private string GetFormattedUserString(User user) 
{ 
    return string.Concat(user.Id, "/", user.Name, "/", string.Join(",", user.Skills.Select(skill => string.Concat(skill.SN, "-", skill.SL)))); 
} 

Эффективное и менее понятно (на мой взгляд) способ заключается в использовании StringBuilder:

public IHttpActionResult ImportUsers([FromBody] IEnumerable<User> newUsers) 
{ 
    var sb = new StringBuilder(); 

    foreach (var user in newUsers) 
    { 
     sb.Append(user.Id); 
     sb.Append("/"); 

     sb.Append(user.Name); 
     sb.Append("/"); 

     for (int i = 0; i < user.Skills.Length; i++) 
     { 
      sb.Append(user.Skills[i].SN); 
      sb.Append("-"); 
      sb.Append(user.Skills[i].SL); 
      if (i != user.Skills.Length) 
       sb.Append(","); 
     } 

     sb.Append(";"); 
    } 

    var result = sb.ToString(); 
    return Ok(result); 
} 
+0

Просто удивительный! Оба они отлично работают. Спасибо) –

0

Вы можете немного изменить свой код, чтобы сделать его Работа. Для того, чтобы получить навыки, как вы хотите, вы можете вложить еще foreach цикл, который будет создавать список навыков в требуемом формате:

var dict = JsonConvert.DeserializeObject<dynamic>(agents); 
List<string> results = new List<string>(); 
foreach (var d in dict) 
{ 
    List<string> skills = new List<string>(); 

    foreach (var s in d["Skills"]) 
    { 
     skills.Add(s["SN"].ToString() + "-" + s["SL"].ToString()); 
    } 

    string skill = string.Join(",", skills); 
    string list = d["Id"] + "/" + d["Name"] + "/" + skill; 
    results.Add(list); 
} 
string result = string.Join(";", results); 
+0

Спасибо, приятель. Это действительно полезно для меня! –

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