2011-09-29 40 views
43

Tôi nhận được một chuỗi chứa JSON hợp lệ từ một dịch vụ khác. Tôi chỉ muốn chuyển tiếp chuỗi này với Nancy mà còn đặt loại nội dung thành "application/json" cho phép tôi loại bỏ nhu cầu sử dụng $ .parseJSON (dữ liệu) ở phía máy khách.Trả lại một chuỗi chứa Json hợp lệ với Nancy

Nếu tôi sử dụng Response.AsJson có vẻ như mangle JSON vào chuỗi và thêm ký tự thoát. tôi có thể tạo ra một Stream với chuỗi và thiết lập các loại phản ứng gì đó như:

Response test = new Response(); 
test.ContentType = "application/json"; 
test.Contents = new MemoryStream(Encoding.UTF8.GetBytes(myJsonString)); 

nhưng muốn biết nếu có một cách đơn giản hơn?

Trả lời

48

Tôi thích rằng bạn nghĩ rằng nên có một cách tốt hơn vì bạn phải sử dụng 3 dòng mã, tôi nghĩ rằng nói điều gì đó về Nancy :-)

tôi không thể nghĩ ra một cách "tốt hơn" để làm điều đó, bạn có thể làm điều đó một cách getBytes:

Get["/"] = _ => 
    { 
     var jsonBytes = Encoding.UTF8.GetBytes(myJsonString); 
     return new Response 
      { 
       ContentType = "application/json", 
       Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length) 
      }; 
    }; 

Hoặc cách "truyền một chuỗi":

Get["/"] = _ => 
    { 
     var response = (Response)myJsonString; 

     response.ContentType = "application/json"; 

     return response; 
    }; 

Cả hai đều làm điều tương tự - thứ hai là mã ít hơn, mô tả chi tiết hơn (imo).

+0

Nhờ nó tốt đẹp để xem cả hai lựa chọn. – Dave

5

Khá nhiều cách bạn làm. Bạn có thể làm

var response = (Response)myJsonString; 
response.ContentType = "application/json"; 

Bạn chỉ có thể tạo phương thức tiện ích trên IResponseFormatter và cung cấp trình trợ giúp AsXXXX của riêng bạn. Với bản phát hành 0.8 sẽ có một số phần mở rộng trên phản ứng tự nó để bạn có thể làm những thứ như WithHeader (..), WithStatusCode() v.v.

65

Hình như Nancy đã có một phương pháp khuyến nông Response.AsJson đẹp:

Get["/providers"] = _ => 
      { 
       var providers = this.interactiveDiagnostics 
            .AvailableDiagnostics 
            .Select(p => new { p.Name, p.Description, Type = p.GetType().Name, p.GetType().Namespace, Assembly = p.GetType().Assembly.GetName().Name }) 
            .ToArray(); 

       return Response.AsJson(providers); 
      }; 
+0

Lưu ý để giải pháp này hoạt động, bạn cần có thiết lập JsonSerializer đúng nếu bạn dự định sử dụng trình nối tiếp JSON khác với trình mặc định. Tôi thích câu trả lời của Steven Robbins hơn. – MaYaN

+0

Phụ lục: Hướng dẫn sử dụng serializer Newtonsoft với Nancy https://github.com/NancyFx/Nancy.Serialization.JsonNet – Roberto

10

này cũng hoạt động:

Response.AsText(myJsonString, "application/json"); 
Các vấn đề liên quan