2016-11-26 3 views
1

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

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; 
} 

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

Unhandled Exception:

Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: {. Path '', line 1, position 2

это текст JSON:

json "[{\"Id\":1,\"FirstName\":\"a\",\"LastName\":\"b\",\"UserName\":\"user\",\"Email\":\"[email protected]\",\"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 

ответ

1

Учитывая значение предоставленного 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; 
    } 
} 
+0

эй я получаю сообщение об ошибке: на до последней стадии операции этого необработанное исключение: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Newtonsoft.Json.Linq.JObject«не содержит определение для 'Id» – JayPhillips

+0

первый или по умолчанию в списке ничего не сделал – JayPhillips

+0

Я протестировал его в модульном тесте, и он вернул результат без каких-либо ошибок. – Nkosi

0

Вы должны создать модель вашего 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; 
}; 


Update после @JayPhillips, которые хотят иметь "реальный" файл в формате JSON:

[ 
    { 
     "Id":1, 
     "FirstName":"a", 
     "LastName":"b", 
     "UserName":"user", 
     "Email":"[email protected]", 
     "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

* «Вы должны создать модель вашего файла Json с помощью ...» * ... * Вы можете * ;-), есть и другие большие источники, где вы можете сделать это и Visual Studio имеет встроенный в особенности для него. – Jim

+0

@Jim Это аддон для визуальной студии? – Yanga

+2

он встроен ... скопируйте некоторые json и 'Edit> Paste special> Paste JSON As Classes' – Jim

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