2013-10-25 3 views
5

JSON.net을 사용하여 json 파일을 읽는 방법을 이해하는 데 약간의 어려움이 있습니다.C# 및 JSON.net으로 JSON 파일 읽기

파일은 다음과 같이보고한다 :

"version": { 
    "files": [ 
     { 
      "url": "http://www.url.com/", 
      "name": "someName" 
     }, 
     { 
      "name": "someOtherName" 
      "url": "http://www.url.com/" 
      "clientreq": true 
     }, .... 
난 정말 내가이 파일을 읽을 수 있습니다 얼마나 많은 생각이없는

은 .. 내가 뭘해야 할 것은 선을 읽고 통해 파일을 다운로드하는 것입니다 은 " url ".. 파일을 다운로드하는 방법을 알고 있지만 JSON.net을 사용하여 각 섹션을 통해 JSON 파일을 읽고 루프를 통해 파일을 다운로드하는 방법을 알고 있습니다.

도움을 주실 수 있습니까?

답변

8

가장 쉬운 방법은 그럼 당신은

dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString); 

var urls = new List<string>(); 

foreach(var file in result.version.files) 
{ 
    urls.Add(file.url); 
} 
+0

이 방법을 사용하면 결국 가장 단순 해 보입니다. 무리 감사. 정보에 대해 나는 streamreader를 사용하여 파일의 내용을 readtoend로 읽었습니다.이 파일을 "jsonString"으로 사용했습니다. –

5

http://json2csharp.com/ 당신이 기반으로 C#을 클래스를 만들 수 있습니다 URL을 가져 오기위한 속성 루프에 액세스 할 수 있습니다이

같은 동적 객체로 JSON을 역 직렬화하는 것입니다 JSON 데이터 유형. 당신이 당신의 데이터와 일치하는 클래스를 한 후에는 Json.NET로 직렬화 한 다음 데이터로 작업 할 수 있습니다

var myMessage = JsonConvert.DeserializeObject<MyMessage>(myString); 
foreach (var file in myMessage.Version.Files) 
{ 
    // download file.Url 
} 

또는 당신은 dynamic 객체로서 액세스 할 수 있습니다

dynamic myMessage = JsonConvert.DeserializeObject(myString); 
foreach (var file in myMessage.version.files) 
{ 
    // download file.url 
} 

당신이 클래스를 사용하는 경우 그들은 수 있습니다 :

public class File 
{ 
    public Uri Url { get; set; } 
    public string Name { get; set; } 
    public bool? ClientReq { get; set; } 
} 

public class Version 
{ 
    public IList<File> Files { get; set; } 
} 

public class MyMessage 
{ 
    public Version Version { get; set; } 
} 

(Json.Net이 경우 다른 속성을 매핑 할 수 똑똑 점에 유의하고, 열린 우리당 객체로 URL을 설정)이 문자열이 다음과 같을 때 작동합니다 :

string myString = @"{""version"": { 
    ""files"": [ 
     { 
      ""url"": ""http://www.url.com/"", 
      ""name"": ""someName"" 
     }, 
     { 
      ""name"": ""someOtherName"", 
      ""url"": ""http://www.url.com/"", 
      ""clientreq"": true 
     }]}}"; 
+0

"Json.Net은 대소 문자가 다른 속성을 매핑하기에 충분히 똑똑합니다." CamelCasePropertyNamesContractResolver를 사용합니다. –

+1

@EstebanElverdin 명시 적으로 계약 리졸버를 지정하지 않고 코드가 작동하기 때문에 (기본적으로'clientreq'를'ClientReq'에 매핑하기 때문에) 기본적으로 그렇게 할 것 같습니다. –

+0

네, 맞습니다. 예를 들어 그럴 필요가 없습니다. 제가 작업 한 일부 코드를 검토하고 이것이 기본적으로 수행하지 않은 이유를 살펴 보겠습니다. –