Публикувайте в WebApi и получете резултат HttpClient

Опитвам се да изпратя публикация до моя WebApi и следващото получаване и десериализиране на резултата към моя обект. Изпращам публикация от Windows Phone 8.1. Как да получа обект, изпратен от моя Web Api?

Моят конструктор:

public MyTravelsPage()
{
     Task getTravels = this.GetTravels();
}

internal async Task GetTravels()
{
    string uri = "http://localhost:6234/api/services/app/travel/GetMyTravels";
    TravelPositions travel = new TravelPositions();
    travel.UserGuid = UserIdentity.UserId;
    string x = JsonConvert.SerializeObject(travel);
    var stringContent = "";
    using (var client = new System.Net.Http.HttpClient())
    {
        // New code:
        client.BaseAddress = new Uri(uri);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpContent content = new StringContent(x, Encoding.UTF8);
        var response = await client.PostAsync(uri, new StringContent(x, Encoding.UTF8, "application/json"));
        var p = response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(p.Result);
    }

}

В p.Result получавам този низ:

"{\"success\":true,\"result\":{\"output\":[{\"id\":1,\"userGuid\":\"334e5955-fe89-4a49-b8ab-f0b36575bd8d\",\"where\":\"Bukowno\",\"forMoney\":false,\"money\":\"\",\"peopleCount\":1,\"driverGuid\":null,\"longitude\":-122.188606,\"latitude\":47.622482},{\"id\":2,\"userGuid\":\"334e5955-fe89-4a49-b8ab-f0b36575bd8d\",\"where\":\"Krakow\",\"forMoney\":false,\"money\":\"\",\"peopleCount\":1,\"driverGuid\":null,\"longitude\":-122.188606,\"latitude\":47.622482},{\"id\":3,\"userGuid\":\"334e5955-fe89-4a49-b8ab-f0b36575bd8d\",\"where\":\"Warszawa\",\"forMoney\":true,\"money\":\"\",\"peopleCount\":2,\"driverGuid\":null,\"longitude\":-122.188606,\"latitude\":47.622482},{\"id\":4,\"userGuid\":\"334e5955-fe89-4a49-b8ab-f0b36575bd8d\",\"where\":\"Zakopane\",\"forMoney\":false,\"money\":\"\",\"peopleCount\":1,\"driverGuid\":null,\"longitude\":-122.188606,\"latitude\":47.622482}]},\"error\":null,\"unAuthorizedRequest\":false}"

Как да получите само стойност "резултат" от този json низ?

За съжаление, последният ми ред:

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(p.Result);

Не дава речника ... Само грешка

За повече информация това е обект от WebApi

public class TravelOutput
{
    public List<Travel> output { get; set; }
}

public class Travel
{
    public int Id { get; set; }
    public Guid UserGuid { get; set; }
    public string Where { get; set; }
    public bool ForMoney { get; set; }
    public string Money { get; set; }
    public int PeopleCount { get; set; }
    public Guid? DriverGuid { get; set; }
    public double Longitude { get; set; }
    public double Latitude { get; set; }
}

person kol1991    schedule 19.08.2015    source източник
comment
възможен дубликат на Using JsonConvert.DeserializeObject to deserialize Json към C# POCO клас   -  person MethodMan    schedule 19.08.2015
comment
Не дава речника ... Само грешка Каква е грешката?   -  person Yuval Itzchakov    schedule 19.08.2015
comment
когато опитам var obj = JsonConvert.DeserializeObject‹TravelOutput›(p.Result); Имам нула   -  person kol1991    schedule 19.08.2015
comment
Да, но какво казва грешката.   -  person Yuval Itzchakov    schedule 19.08.2015
comment
Грешка при опит за десериализация в речника: Възникна необработено изключение от тип „Newtonsoft.Json.JsonReaderException“ в Newtonsoft.Json.DLL Допълнителна информация: Грешка при четене на низ. Неочакван токен: StartObject. Път 'резултат', ред 1, позиция 26.   -  person kol1991    schedule 19.08.2015


Отговори (1)


Имате нужда от основен обект за десериализация

public class RootObject
{
    public bool success { get; set; }
    public TravelOutput result { get; set; }
    public bool unAuthorizedRequest { get; set; }
}

Сега можете да десериализирате като

var result = JsonConvert.DeserializeObject<RootObject>(p.Result);

вашият списък е result.result.output сега

person Eser    schedule 19.08.2015
comment
Хубаво, работи, но си помислих, че мога да направя това по-лесно, тъй като сега трябва да създавам винаги нов RootObject, когато променя резултатния си обект. Thx наистина е полезно - person kol1991; 19.08.2015
comment
Защо не е Guid? Генерира се с помощта на метода Guid.NewGuid() и е стандартен guid. Wiki GUID обикновено се съхраняват като 128-битови стойности и обикновено се показват като 32 шестнадесетични цифри с групи, разделени с тирета, като {21EC2020-3AEA-4069-A2DD-08002B30309D}. - person kol1991; 19.08.2015
comment
@kol1991 Добре, декларирайте го като Guid? и ще видите null за тях. Но ако ги декларирате като низ, ще получите стойности.... - person Eser; 19.08.2015