Я пытаюсь получить идентификатор из этого текста json. Я не уверен, как это сделать, чтобы он не позволял мне создавать объект json. Я попытался десериализовать его следующим образом:

public async Task<List<T>> GetIdAsync(string username)
{
    var httpClient = new HttpClient();

    var json = await httpClient.GetStringAsync(WebServiceURL);

    var  Id  = JsonConvert.DeserializeObject<List<T>>(json);

   return Id;
}

Но я получаю эту ошибку во время десериализации

Необработанное исключение:

Newtonsoft.Json.JsonReaderException: при анализе значения обнаружен неожиданный символ: {. Путь '', строка 1, позиция 2

Это текст json:

json    "[{\"Id\":1,\"FirstName\":\"a\",\"LastName\":\"b\",\"UserName\":\"user\",\"Email\":\"d@gmail.com\",\"Password\":\"poSsUrscOuXL+E5qxXsCsA==\",\"CompanyName\":\"c\",\"Salt\":\"n3ZLSwU9L1g=\",\"Address\":{\"Country\":\"c\",\"Province\":\"p\",\"City\":\"c\",\"PostalCode\":\"p\",\"Street\":\"street\",\"StreetNumber\":\"123\"},\"Telephone\":{\"PersonalPhoneNumber\":\"413414\",\"BusinessPhoneNumber\":\"134134\"},\"Location\":{\"Lat\":45.6025839,\"Lng\":-97.8489959}}]"   string
2
JayPhillips 26 Ноя 2016 в 05:17

2 ответа

Лучший ответ

Заданное значение предоставленного JSON, представляющего собой массив объектов. Вы можете использовать динамический объект для извлечения только нужного свойства. Сначала десериализуйте json в List<dynamic>, получите первый объект в списке и вызовите свойство Id.

public async Task<int> GetIdAsync(string username) {
    var httpClient = new HttpClient();

    var json = await httpClient.GetStringAsync(WebServiceURL);

    var list  = JsonConvert.DeserializeObject<List<dynamic>>(json);

    var obj = list.FirstOrDefault();

    int Id = obj != null ? obj.Id : 0;

    return Id;
}

ОБНОВИТЬ:

Протестировал его в простом модульном тесте и прошел, как ожидалось.

[TestClass]
public class UnitTest6 {
    [TestMethod]
    public async Task GetIdAsyncTest() {

        var id = await GetIdAsync("");

        Assert.IsTrue(id > o);
    }

    public async Task<int> GetIdAsync(string username) {
        var httpClient = new HttpClient();
        //simple data just for the purpose of the test.
        var json = await Task.FromResult("[{\"Id\":1,\"FirstName\":\"a\"}]"); //await httpClient.GetStringAsync("");

        var list = JsonConvert.DeserializeObject<List<dynamic>>(json);

        var obj = list.FirstOrDefault();

        int Id = obj != null ? obj.Id : 0;

        return Id;
    }
}
2
Nkosi 26 Ноя 2016 в 03:42

Вы должны создать модель своего Json-файла, используя http://json2csharp.com/:

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string CompanyName { get; set; }
    public string Salt { get; set; }
    public Address Address { get; set; }
    public Telephone Telephone { get; set; }
    public Location Location { get; set; }
}

public class Address
{
    public string Country { get; set; }
    public string Province { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string Street { get; set; }
    public string StreetNumber { get; set; }
}

public class Telephone
{
    public string PersonalPhoneNumber { get; set; }
    public string BusinessPhoneNumber { get; set; }
}

public class Location
{
    public float Lat { get; set; }
    public float Lng { get; set; }
}

А затем десериализуйте это так:

public async Task<int> GetIdAsync(string username)
    {
        var httpClient = new HttpClient();

        var json = await httpClient.GetStringAsync(WebServiceURL);

        var  Id  = JsonConvert.DeserializeObject<Rootobject>(json).Property1.FirstOrDefault().Id;

;

       return Id;
};

[
   {
      "Id":1,
      "FirstName":"a",
      "LastName":"b",
      "UserName":"user",
      "Email":"d@gmail.com",
      "Password":"poSsUrscOuXL+E5qxXsCsA==",
      "CompanyName":"c",
      "Salt":"n3ZLSwU9L1g=",
      "Address":{
         "Country":"c",
         "Province":"p",
         "City":"c",
         "PostalCode":"p",
         "Street":"street",
         "StreetNumber":"123"
      },
      "Telephone":{
         "PersonalPhoneNumber":"413414",
         "BusinessPhoneNumber":"134134"
      },
      "Location":{
         "Lat":45.6025839,
         "Lng":-97.8489959
      }
   }
]
0
Yanga 26 Ноя 2016 в 04:12