WebApi HttpClient поможет получить коллекцию (версия .6) - PullRequest
1 голос
/ 12 января 2012

Я звоню в службу данных WCF v3 Odata. У меня проблемы с заполнением моей коллекции в приведенном ниже примере. Я могу получить строку json из 3 человек, но если я попытаюсь заполнить пользовательскую коллекцию, она будет иметь счет = 0.

HttpClient client = new HttpClient();

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

client.BaseAddress = new Uri("http://localhost:7500/Wcf1.svc/People");

HttpResponseMessage resp = client.GetAsync("").Result;

string jsonString = resp.Content.ReadAsStringAsync().Result;

List<Person> personCollection = resp.Content.ReadAsAsync<List<Person>>().Result;

В jsonString 3 человека.

personCollection имеет число = 0.

jsonString выглядит так:

{"d":[
{"__metadata":{"id":"http://localhost:7500/Wcf1.svc/People(1)",
"uri":"http://localhost:7500/Wcf1.svc/People(1)",
"type":"WcfService1.Person"},
"ID":1,"Fname":"Fred","Lname":"Peters","Address1":"123 Main"},

 {"__metadata":{"id":"http://localhost:7500/Wcf1.svc/People(2)",
"uri":"http://localhost:7500/Wcf1.svc/People(2)",
"type":"WcfService1.Person"},
"ID":2,"Fname":"John","Lname":"Smith","Address1":"123 Oak"},

{"__metadata":{"id":"http://localhost:7500/Wcf1.svc/People(3)",
"uri":"http://localhost:7500/Wcf1.svc/People(3)",
"type":"WcfService1.Person"},
"ID":3,"Fname":"Tom","Lname":"Anders","Address1":"123 Hill St."}]}

Я, должно быть, делаю что-то не так, пожалуйста, укажите мою ошибку, если можете.

Спасибо. Терренс

1 Ответ

3 голосов
/ 12 января 2012

Ваш контент не является списком

Вставьте свой Json в json2csharp , и вы увидите его.

Чтобы получить более полное представление о вашем ответеcontent is, download Json Viewer - это скриншот ваших данных:

enter image description here

Как вы можете видеть: Персоны являются свойством корня Jsonobject.

Если вы хотите использовать свой код сверху, Json должен выглядеть следующим образом (или вам нужен доступ к данным в данной структуре, отображающей ваши классы в соответствии с Json):

[{"__metadata":{"id":"http://localhost:7500/Wcf1.svc/People(1)",
"uri":"http://localhost:7500/Wcf1.svc/People(1)",
"type":"WcfService1.Person"},
"ID":1,"Fname":"Fred","Lname":"Peters","Address1":"123 Main"},

 {"__metadata":{"id":"http://localhost:7500/Wcf1.svc/People(2)",
"uri":"http://localhost:7500/Wcf1.svc/People(2)",
"type":"WcfService1.Person"},
"ID":2,"Fname":"John","Lname":"Smith","Address1":"123 Oak"},

{"__metadata":{"id":"http://localhost:7500/Wcf1.svc/People(3)",
"uri":"http://localhost:7500/Wcf1.svc/People(3)",
"type":"WcfService1.Person"},
"ID":3,"Fname":"Tom","Lname":"Anders","Address1":"123 Hill St."}]}]

Обновление:

Вы сможете проанализировать свой изначально опубликованный Json следующим образом:

var json = JsonValue.Parse(response.Content.ReadAsStringAsync().Result);
var arr = json["d"];
var contact1 = arr[0];
var fname = result1["Fname"];

Я сделал блог недавно опубликовал пост на JsonValue и JsonArray .Это сторона сервера, но она должна указывать вам направление.

2-е обновление:

Используя классы из вывода json2csharp.com, вы можете сделать это:

public class Metadata
{
    public string id { get; set; }
    public string uri { get; set; }
    public string type { get; set; }
}

public class D
{
    public Metadata __metadata { get; set; }
    public int ID { get; set; }
    public string Fname { get; set; }
    public string Lname { get; set; }
    public string Address1 { get; set; }
}

public class RootObject
{
    public List<D> d { get; set; }
}

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

var root = resp.Content.ReadAsAsync<RootObject>().Result;
var persons = root.d;
var person1 = persons[0];
...