Создание объекта JSON PushStreamContent
У меня есть веб-API Asp.net и имеет HTTPResponseMessage
и имя метода API GetPersonDataStream
, который на самом деле поток каждого объекта человека как JSON. Поэтому, когда я вижу результат, фактические данные были сконструированы как два отдельных объекта без запятой между двумя объектами, если они не созданы так, как мне нужно.
Актуальные потоковые данные:{"Name":"Ram","Age":30}{"Name":"Sam","Age":32}
,
Но я хочу, чтобы это передавалось как правильный JSON как:
{"response": [ {"Name":"Ram","Age":30}, {"Name":"Sam","Age":32} ]}
Есть ли способ, которым мы можем достичь этого. Ниже приведен код, который я использую для потоковой передачи данных, потому что количество записей будет в миллионах, и я не хочу создавать все объекты сразу, а затем передавать их в потоковом режиме, потому что это может привести к исключению Syste.OutOfMemory. Так есть ли способ, которым мы могли бы редактировать / конструировать объект перед его передачей. Если да, то как мне этого добиться.
КОД:
[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; }
}
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();
}
});