HTTP Client를 사용하여 JSON을 Array 또는 List로 역직렬화합니다.를 사용하여 ReadAsync 를 읽습니다.NET 4.0 태스크 패턴
에서 반환된 JSON을 역직렬화하려고 합니다.http://api.usa.gov/jobs/search.json?query=nursing+jobs
를 사용합니다.NET 4.0 작업 패턴.이 JSON('JSON 데이터 로드' @)을 반환합니다.http://jsonviewer.stack.hu/
).
[
{
"id": "usajobs:353400300",
"position_title": "Nurse",
"organization_name": "Indian Health Service",
"rate_interval_code": "PA",
"minimum": 42492,
"maximum": 61171,
"start_date": "2013-10-01",
"end_date": "2014-09-30",
"locations": [
"Gallup, NM"
],
"url": "https://www.usajobs.gov/GetJob/ViewDetails/353400300"
},
{
"id": "usajobs:359509200",
"position_title": "Nurse",
"organization_name": "Indian Health Service",
"rate_interval_code": "PA",
"minimum": 42913,
"maximum": 61775,
"start_date": "2014-01-16",
"end_date": "2014-12-31",
"locations": [
"Gallup, NM"
],
"url": "https://www.usajobs.gov/GetJob/ViewDetails/359509200"
},
...
]
인덱스 액션:
public class HomeController : Controller
{
public ActionResult Index()
{
Jobs model = null;
var client = new HttpClient();
var task = client.GetAsync("http://api.usa.gov/jobs/search.json?query=nursing+jobs")
.ContinueWith((taskwithresponse) =>
{
var response = taskwithresponse.Result;
var jsonTask = response.Content.ReadAsAsync<Jobs>();
jsonTask.Wait();
model = jsonTask.Result;
});
task.Wait();
...
}
작업 및 작업 클래스:
[JsonArray]
public class Jobs { public List<Job> JSON; }
public class Job
{
[JsonProperty("organization_name")]
public string Organization { get; set; }
[JsonProperty("position_title")]
public string Title { get; set; }
}
브레이크 포인트를 설정했을 때jsonTask.Wait();
검사하다jsonTask
상태는 Faulted 입니다.InnerException은 "Type ProjectName"입니다.잡스는 컬렉션이 아닙니다.
JsonArray 속성 및 Jobs as array(Job[])가 없는 Jobs(작업) 유형으로 시작했는데 이 오류가 발생했습니다.
public class Jobs { public Job[] JSON; }
+ InnerException {"Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'ProjectName.Models.Jobs' because the type requires a JSON object (e.g. {\"name\":\"value\"}) to deserialize correctly.\r\n
To fix this error either change the JSON to a JSON object (e.g. {\"name\":\"value\"}) or change the deserialized type to an array or a type that implements a collection interface
(e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.\r\n
Path '', line 1, position 1."} System.Exception {Newtonsoft.Json.JsonSerializationException}
를 사용하여 이 사이트의 JSON을 어떻게 처리합니까?NET 4.0 작업 패턴?다음 단계로 넘어가기 전에 이 작업을 수행했으면 합니다.await async
패턴으로 지정합니다.NET 4.5
답변 갱신:
다음은 사용 예를 제시하겠습니다.NET 4.5 비동기에서는 brumScouse의 응답을 사용하여 패턴을 기다립니다.
public async Task<ActionResult>Index()
{
List<Job> model = null;
var client = newHttpClient();
// .NET 4.5 async await pattern
var task = await client.GetAsync(http://api.usa.gov/jobs/search.json?query=nursing+jobs);
var jsonString = await task.Content.ReadAsStringAsync();
model = JsonConvert.DeserializeObject<List<Job>>(jsonString);
returnView(model);
}
이 경우,System.Threading.Tasks
네임스페이스.
주의: 없습니다..ReadAsString
이용 가능한 방법.Content
그 때문에, 제가 이 머신을.ReadAsStringAsync
방법.
모델들이 손으로 꼬옥 소리를 내는 대신 Json2csharp.com 웹사이트 같은 것을 사용해 보세요.붙여넣기 JSON 응답 예에서는 꽉 찰수록 좋고 생성된 클래스를 가져옵니다.이렇게 하면 적어도 일부 가동 부품이 제거되므로 csharp의 JSON 형상을 얻을 수 있으므로 시리얼 라이저에 시간을 쉽게 할 수 있으므로 속성을 추가할 필요가 없습니다.
작업을 시작한 후 클래스 이름을 수정하고 명명 규칙에 따라 나중에 속성을 추가합니다.
편집: 네, 약간의 조작을 거쳐 결과물을 List of Job으로 성공적으로 역직렬화했습니다(Json2csharp.com를 사용하여 클래스를 만들었습니다).
public class Job
{
public string id { get; set; }
public string position_title { get; set; }
public string organization_name { get; set; }
public string rate_interval_code { get; set; }
public int minimum { get; set; }
public int maximum { get; set; }
public string start_date { get; set; }
public string end_date { get; set; }
public List<string> locations { get; set; }
public string url { get; set; }
}
코드 편집:
List<Job> model = null;
var client = new HttpClient();
var task = client.GetAsync("http://api.usa.gov/jobs/search.json?query=nursing+jobs")
.ContinueWith((taskwithresponse) =>
{
var response = taskwithresponse.Result;
var jsonString = response.Content.ReadAsStringAsync();
jsonString.Wait();
model = JsonConvert.DeserializeObject<List<Job>>(jsonString.Result);
});
task.Wait();
즉, 포함된 개체를 제거할 수 있습니다.이것은 작업 관련 문제가 아니라 역직렬화 문제라는 점에 유의할 필요가 있습니다.
편집 2:
JSON 개체를 가져와서 Visual Studio에서 클래스를 생성하는 방법이 있습니다.선택한 JSON을 복사하고 Edit > Paste Special > Paste JSON as Classes 를 선택합니다.여기에서는, 이것에 관한 페이지 전체를 정리하고 있습니다.
http://blog.codeinside.eu/2014/09/08/Visual-Studio-2013-Paste-Special-JSON-And-Xml/
var response = taskwithresponse.Result;
var jsonString = response.ReadAsAsync<List<Job>>().Result;
반환 유형은 서버에 따라 다릅니다.응답이 실제로는 JSON 어레이이지만 텍스트/보통으로 전송되는 경우도 있습니다.
요청에서 accept 헤더를 설정하면 올바른 유형을 얻을 수 있습니다.
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
그런 다음 JSON 목록 또는 어레이에 시리얼화할 수 있습니다.@svick의 코멘트를 받고, 그것이 작동해야 하는지 궁금하게 해 주셔서 감사합니다.
accept 헤더를 설정하지 않고 얻은 예외는 System이었습니다.Net.Http.지원되지 않는 MediaTypeException입니다.
다음 코드가 더 깨끗하고 작동해야 합니다(테스트되지 않았지만 내 경우에는 작동).
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync("http://api.usa.gov/jobs/search.json?query=nursing+jobs");
var model = await response.Content.ReadAsAsync<List<Job>>();
언급URL : https://stackoverflow.com/questions/24131067/deserialize-json-to-array-or-list-with-httpclient-readasasync-using-net-4-0-ta
'programing' 카테고리의 다른 글
워드프레스에서 wp_get_attachment_image()를 올바르게 사용하는 방법 (0) | 2023.03.15 |
---|---|
업로드 중 오류가 발생했습니다.이미지를 편집기에 업로드할 때 나중에 다시 시도하십시오."라는 워드프레스를 사용합니다. (0) | 2023.03.15 |
ArgumentError(인수가 너무 적음): 레일 4.04에서 format.json을 호출할 때 (0) | 2023.03.15 |
React를 사용하여 입력값을 올바르게 검증하는 방법.JS? (0) | 2023.03.15 |
@WebMvcTest를 사용하여 "최소 1개의 JPA 메타모델이 존재해야 합니다"를 가져옵니다. (0) | 2023.03.15 |