2013-08-16 2 views
3

명시 적으로 문서를 빌드하여 Stream에 JSON을 쓰고 싶습니다. 예를 들어 :문자열을 메모리에 버퍼링하지 않고 스트림에 JSON 쓰기

var stream = ...; 
var writer = new JsonWriter(stream); 

writer.BeginArray(); 
{ 
    writer.BeginObject(); 
    { 
    writer.String("foo"); 
    writer.Number(1); 
    writer.String("bar"); 
    writer.Number(2.3); 
    } 
    writer.EndObject(); 
} 
writer.EndArray(); 

이 생산하는 것 :

[ 
    { 
    "foo": 1, 
    "bar": 2.3 
    } 
] 

이 방법의 장점은 아무것도 메모리에 버퍼링 할 필요가 없다는 것입니다. 필자의 상황에서는 스트림에 상당량의 JSON을 작성하고있다. this one과 같은 솔루션에는 메모리에있는 모든 객체를 만든 다음 메모리에있는 큰 문자열로 직렬화 한 다음이 문자열을 스트림과 가비지 수집에 쓰고 아마도 LOH에서 발생합니다. 다른 파일/DB/etc 스트림에서 데이터를 읽는 동안 요소를 써서 내 메모리 사용을 낮게 유지하고 싶습니다.

이런 종류의 접근법은 rapidjson library을 통해 C++에서 사용할 수 있습니다.

나는 이것을 위해 공정한 비트를 조사했지만 해결책을 찾지 못했습니다.

답변

9

나는 조금 더 오래 Google에 필요했다.

JSON.NET은 실제로 JsonWriter 클래스를 통해이를 지원합니다.

내 예는 작성 될 것이다 :

Stream stream = ...; 

using (var streamWriter = new StreamWriter(stream)) 
using (var writer = new JsonTextWriter(streamWriter)) 
{ 
    writer.Formatting = Formatting.Indented; 

    writer.WriteStartArray(); 
    { 
     writer.WriteStartObject(); 
     { 
      writer.WritePropertyName("foo"); 
      writer.WriteValue(1); 
      writer.WritePropertyName("bar"); 
      writer.WriteValue(2.3); 
     } 
     writer.WriteEndObject(); 
    } 
    writer.WriteEndArray(); 
} 
+0

왜 당신이 그 불필요한'{','}'의 사용합니까? – I4V

+1

왜 단순히'jsonSerializer.Serialize (jsonTextWriter, obj)'를하는 대신 모든 요소를 ​​직접 수동으로 작성해야합니까? – I4V

+2

@ I4V -'{}'는 읽기 쉽도록되어 있으며 선택 사항입니다. 평범하지 않은 예제에서 그들은 정말로 도움이 될 수 있습니다. 간단한 반복 형식을 따르는 많은 요소가 많이 있다면 요소를 수동으로 작성하는 것이 좋습니다. 예를 들어, 'SqlDataReader'에서 100,000 개의 요소를 사용하여 HTTP 응답 스트림에 JSON을 작성하는 경우이 방법으로 작성하면'OutOfMemoryException '이 발생하지 않으며 OOME이 없어도 웹 서버의 성능이 훨씬 향상됩니다 . 그래서, 그것은 당신의 상황의 요구에 달려 있습니다. –

관련 문제