c#
  • asp.net
  • linq
  • json.net
  • 2013-12-18 2 views 3 likes 
    3

    JSON.Net을 사용하고 다음 JSON을 반복하여 "사진"개체의 각 구성원에 대해 하나의 HTML 이미지 태그 (문자열)를 출력 할 수 있습니까?JSON.Net을 사용하여 JSON을 읽고 HTML을 출력하는 방법?

    내 목표는 JSON 출력 다음은이 문자열을 읽을 수 있습니다 :

    "<img src='/images/foo.jpg' alt='Hello World!'><img src='/images/bar.jpg' alt='Another Photo' />" 
    

    JSON은 외부 파일 "photos.json"에 저장됩니다

    { 
        "photos": { 
         "photo1": { 
          "src": "/images/foo.jpg", 
          "alt": "Hello World!" 
         }, 
         "photo2": { 
          "src": "/images/bar.jpg", 
          "alt": "Another Photo" 
         } 
        } 
    } 
    

    나는 비슷한 코드로 시작했습니다 여기에 표시되는 내용 : http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx

    var client = new WebClient(); 
    client.Headers.Add("User-Agent", "Nobody"); 
    var response = client.DownloadString(new Uri("http://www.example.com/photos.json")); 
    JObject o = JObject.Parse(response);' 
    //Now o is an object I can walk around... 
    

    그러나 나는 "걷기"하는 방법을 찾지 못했습니다. n 예에서.

    사진 개체의 각 구성원을 반복하여 속성을 읽고 각 사진의 문자열에 html을 추가하고 싶습니다.

    여기까지 표시된 예제를 시도해 보았습니다. http://james.newtonking.com/json/help/index.html?topic=html/QueryJson.htm 하지만 각 루프에 대해 한 번만 사용할 수는 없습니다.

    답변

    7

    는 "산책"할 수있는 방법입니다 JObject에서 필요한 정보를 추출하십시오.

    string json = @" 
    { 
        ""photos"": { 
         ""photo1"": { 
          ""src"": ""/images/foo.jpg"", 
          ""alt"": ""Hello World!"" 
         }, 
         ""photo2"": { 
          ""src"": ""/images/bar.jpg"", 
          ""alt"": ""Another Photo"" 
         } 
        } 
    }"; 
    
    StringBuilder sb = new StringBuilder(); 
    JObject o = JObject.Parse(json); 
    
    foreach (JProperty prop in o["photos"].Children<JProperty>()) 
    { 
        JObject photo = (JObject)prop.Value; 
        sb.AppendFormat("<img src='{0}' alt='{1}' />\r\n", 
            photo["src"], photo["alt"]); 
    } 
    
    Console.WriteLine(sb.ToString()); 
    

    출력 :

    <img src='/images/foo.jpg' alt='Hello World!' /> 
    <img src='/images/bar.jpg' alt='Another Photo' /> 
    
    2

    먼저 당신이 당신의 데이터를 보유하는 클래스를 정의해야하고 또한 HTML 태그로 출력 자체 수 :

    public class Photo 
    { 
        public string Src { get; set; } 
        public string Alt { get; set; } 
    
        public string ToHtml() 
        { 
         return string.Format(
          "<img src='{0}' alt='{1}'/>, 
          this.Src, 
          this.Alt); 
        } 
    } 
    

    만드는 JSON.Net을 사용할 수 있도록하기 위해서 객체를 입력 JSON을 '정상화'해야합니다. 동일한 객체 배열을 나타내는 일반적인 형식이 아닙니다. 식별자 photo*1*, photo*2*,.., photo*n*을 완전히 없애거나 동일하게해야합니다 (예 : 모두 숫자가없는 photo). JSON 작성을 제어 할 수 있다면 바로 할 수 있습니다. 그렇지 않으면 적절하게 웹 응답을 조작해야합니다 (예 : string.Replace(...)).

    이 필요한 HTML을 얻을 당신이 유형이 지정된 목록을 가져 JSON.Net을 사용할 수 있으며, 이후 당신은 단순히 그것을 통해 반복 할 수 있음을 수행 갖는

    여기
    var client = new WebClient(); 
    client.Headers.Add("User-Agent", "Nobody"); 
    string response = client.DownloadString(new Uri("http://www.example.com/photos.json")); 
    // --> 'Normalize' response string here, if necessary 
    List<Photo> photos = JsonConvert.DeserializeObject<List<Photo>>(response); 
    
    // now buid the HTML string 
    var sb = new StringBuilder(); 
    foreach(photo in photos) 
    { 
        sb.Append(photo.ToHtml()); 
    } 
    string fullHtml = sb.ToString(); 
    ... 
    
    +0

    감사합니다 토마스! 어떤 접근 방식이 더 좋은지 잘 모르겠지만 브라이언 로저스 (Brian Rogers)를 사용하면 끝났습니다. – edt

    관련 문제