我有asp.net web api并且有一个HTTPResponseMessage
和api方法名GetPersonDataStream
,它实际上将每个人对象作为json流。因此,当我看到结果时,实际的数据被构造成两个单独的对象,两个对象之间没有逗号,它是不是按照我的要求构造的。
实际流式数据:
{"Name":"Ram","Age":30}{"Name":"Sam","Age":32}
。
但我希望将其作为正确的JSON流式传输:
{"response": [ {"Name":"Ram","Age":30}, {"Name":"Sam","Age":32} ]}
我们有没有办法实现它。下面是我用来传输数据的代码,因为记录的数量将是数百万,我不想一次创建所有对象然后流式传输,因为这可能导致Syste.OutOfMemory异常。那么有没有一种方法可以在流式传输之前编辑/构造对象。如果是,我怎样才能实现它。
CODE:
[HttpGet]
[Route("GetPersonDataStream")]
public HttpResponseMessage GetPersonDataStream()
{
List<Person> ps = new List<Person>();
Person p1 = new Person();
p1.Name = "Ram";
p1.Age = 30;
Person p2 = new Person();
p2.Name = "Sam";
p2.Age = 32;
ps.Add(p1);
ps.Add(p2);
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content =
new PushStreamContent((stream, content, context) =>
{
foreach (var item in ps)
{
//var result = _clmmgr.GetApprovedCCRDetail(item.ccr_id, liccrDetails);
var serializer = new JsonSerializer();
using (var writer = new StreamWriter(stream))
{
serializer.Serialize(writer, item);
stream.Flush();
}
}
});
return response;
}
public class Person
{
public string Name {get;set;}
public int Age { get; set; }
}
答案 0 :(得分:1)
使用JSON.NET及其JsonTextWriter
,您可以将所有项目包装在带有数组的JSON对象中,并且仍然可以在不先在内存中构建所有内容的情况下传输结果。
response.Content =
new PushStreamContent((stream, content, context) =>
{
using (var sw = new StreamWriter(stream))
using (var jsonWriter = new JsonTextWriter(sw))
{
jsonWriter.WriteStartObject();
{
jsonWriter.WritePropertyName("response");
jsonWriter.WriteStartArray();
{
foreach (var item in ps)
{
var jObject = JObject.FromObject(item);
jObject.WriteTo(jsonWriter);
}
}
jsonWriter.WriteEndArray();
}
jsonWriter.WriteEndObject();
}
});