Создание объекта JSON PushStreamContent - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть веб-интерфейс asp.net, HTTPResponseMessage и имя метода API GetPersonDataStream, которые фактически передают каждый объект person в виде 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 Ответ

0 голосов
/ 27 апреля 2018

С 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();
        }
    });
...