json.net разбирает windows phone - PullRequest
0 голосов
/ 30 июня 2011

Я делаю запрос к серверу и получаю ответ

    {"response":[{"uid":18186153,"first_name":"Vlad","last_name":"Prylipko","online":0,"lists":[1]},
{"uid":22285147,"first_name":"Max","last_name":"Apro","online":0,"lists":[1]},
{"uid":22532029,"first_name":"Sofi","last_name":"Cei","online":0,"lists":[1]},

Я пытаюсь разобрать его в список (не сейчас, но в будущем) и хочу получить массив со строками типа

string[] names=["Vlad","Max","Sofi"]
string[] uids=["18186153","22285147","22532029"]

Вот мой не работающий код = (. Я использую Json.net для WP7

    void c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
                {
                    lock (this)
                    {


      string xx = e.Result;
                        string result = xx.Substring(13,xx.Length-15);
                       // JOb

ject o = JObject.Parse(xx);

                    Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(result);
                    foreach (string name in values.Keys)
                    {
                        Debug.WriteLine(name);
                    }
                    /*JDi z = JArray.Parse(xx);
                    for (int i = 0; i < 50; i++)
                    {

                        var list = z["first_name"][i];
                        // MessageBox.Show(list.ToString());
                        Debug.WriteLine(list.ToString());
                    }
                   /* for (int i = 0; i < o.; i++)
                    {
                        string name = (string)o[i]["first_name"];
                        Debug.WriteLine(name);
                    }*/

                }

Я знаю, что делать, но не знаю как. У меня естьсловарь со значениями ключей и необходимостью для каждого из них собирать его в массивы типа

for(int i=0;i<dictionary.items;i++)
{
    if dictionary.item.key[i]=['first_name']
        string_array_first_names[i]=dictionary.item.key[i];
}

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

Я считаю, что при работе с JSON всегда лучше создать структуру объекта в коде и загрузить ее, подстрока, которую вы делаете, рискованна и трудна для понимания через 6 месяцев. Оттуда вы можете использовать LINQ для получения любых массивов или словарей, которые вам нужны.

string json = e.Result;
var response = JsonConvert.DeserializeObject<Response>(json);
string[] names = response.Users.Select(d=> d.First_Name).ToArray();
string[] uids = response.Users.Select(d=> d.Uid).ToArray();
Dictionary<string, User> users = response.Users.ToDictionary(d=> d.First_Name);
Dictionary<string, string> usersById = response.Users.ToDictionary(d=> d.Uid, d=> d.First_Name);

public class Response {
  public User[] Users {get; set;}
}

public class User {
  public string Uid {get; set; }
  public string First_Name {get; set; }
  public string Last_Name {get; set; }
  public int Online {get; set; }
  public int[] Lists {get; set; }
}
1 голос
/ 07 июля 2011
for (int i = 0; i < count_friends; i++)
                    {
                        string photo_url = response["response"][i]["photo_medium_rec"].ToString();
                        usr[i].Uid = (int)response["response"][i]["uid"];
                        usr[i].First_Name = response["response"][i]["first_name"].ToString();
                        usr[i].Last_Name = response["response"][i]["last_name"].ToString();
                        usr[i].photo_url = photo_url;
                        lcst[i].bitmp = ImageCacher.ImageCacher.GetCacheImage(photo_url);
                        lcst[i].url = photo_url;
                        usr[i].isonline = Convert.ToBoolean((int)response["response"][i]["online"]);
                    }
0 голосов
/ 30 июня 2011
string json = e.Result;
var response = JObject.Parse(json);

var getcount = response["response"].Children<JObject>();
int count_friends=getcount.Cast<JToken>().Values("uid").Count();
Response rr = new Response();
for (int i = 0; i <count_friends; i++)
{
   // rr.Users.ToDictionary(rr.Users[i].Uid => response["response"][i]["uid"].ToString());
    rr.Users[i].First_Name = response["response"][i]["first_name"].ToString();
   // Debug.WriteLine("OUT: "+(string)response["response"][i]["uid"].ToString());
}
...