C #으로 JSON 파일을 작성하는 방법은 무엇입니까?


146

C #에서 JSON 형식을 사용하여 다음 데이터를 텍스트 파일에 작성해야합니다. 대괄호는 유효한 JSON 형식이어야합니다.

[
  {
    "Id": 1,
    "SSN": 123,
    "Message": "whatever"

  },
  {
   "Id": 2,
    "SSN": 125,
    "Message": "whatever"
  }
]

내 모델 클래스는 다음과 같습니다.

public class data
{
    public int Id { get; set; }
    public int SSN { get; set; }
    public string Message { get; set;}
}

답변:


276

Json.Net 을 권장 합니다 (아래 예 참조).

List<data> _data = new List<data>();
_data.Add(new data()
{
    Id = 1,
    SSN = 2,
    Message = "A Message"
});

string json = JsonConvert.SerializeObject(_data.ToArray());

//write string to file
System.IO.File.WriteAllText(@"D:\path.txt", json);

또는 위 코드의 약간 더 효율적인 버전 (문자열을 버퍼로 사용하지 않음) :

//open file stream
using (StreamWriter file = File.CreateText(@"D:\path.txt"))
{
     JsonSerializer serializer = new JsonSerializer();
     //serialize object directly into file stream
     serializer.Serialize(file, _data);
}

설명서 : JSON을 파일로 직렬화


왜? 다음 은 일반적인 직렬 변환기와 벤치 마크 테스트 † ‡ 의 기능 비교 입니다.

아래는 링크 된 기사에서 얻은 성능 그래프입니다.

여기에 이미지 설명을 입력하십시오

별도의 게시물은 다음 과 같이 말합니다.

Json.NET은 항상 메모리 효율성이 뛰어나서 큰 문서를 메모리에 완전히로드하지 않고 읽기 및 쓰기를 스트리밍하지만 객체 할당을 줄일 수있는 몇 가지 주요 위치를 찾을 수있었습니다 ...... (현재) Json.Net (6.0) JavaScriptSerializer 이상 할당 8 배 적은 메모리


.Net Core 3.0 이후 업데이트

이 글을 쓴 후 새로운 아이 System.Text.Json가 .Net Core 3.0에 추가되었습니다. Microsoft는 이것이 Newtonsoft보다 나은 점에 대해 몇 가지 주장을합니다 . 그것을 포함하면 Newtonsoft보다 빠릅니다 . 위와 같이, 나는이 자신을 테스트하기 위해 조언을 줄 .

† 벤치 마크는 Json.Net 5로, 현재 버전 (작성 중)은 10입니다. 사용 된 표준 .Net 직렬 변환기 버전은 언급되지 않았습니다.

이 테스트는 분명히 라이브러리를 유지 관리하는 개발자가 수행 한 것입니다. 나는 그들의 주장을 확인하지 않았다 . 의심스러운 경우 직접 테스트하십시오.


1
JSON.NET은 JavaScriptSerializerDataContractJsonSerializer클래스 에서 제공하는 기본 제공 지원과 어떻게 다릅니 까?
Robert Harvey

2
@RobertHarvey Liam의 Json.Net 링크에는 차이점이 무엇인지 보여주는 멋진 표가 있습니다. 그것을 만드는 사람들에게서 오는 것은 물론 소금 한 덩어리로 가져 가야하지만 실제로 내장 된 것보다 낫습니다.
Tim S.

1
예, 계속해서 파일에 추가해야하지만 모두 같은 배열에 있어야합니다.
user1429595

1
이 경우 파일을 읽고 객체로 구문 분석하고 객체에 추가 한 다음 다시 파싱해야합니다.
Liam

4
@Drew Noakes 메모리에 먼저 넣지 않고 파일에 쓰려면 JSON.NET에서이 쓰기를 시도하십시오. james.newtonking.com/archive/2009/02/14/…
gcoleman0828

62

Liam의 답변 예제는 파일을 한 줄에 문자열로 저장합니다. 형식을 추가하는 것을 선호합니다. 나중에 누군가 파일에서 일부 값을 수동으로 변경하려고 할 수 있습니다. 서식을 추가하면 더 쉽게 서식을 지정할 수 있습니다.

다음은 기본 JSON 들여 쓰기를 추가합니다.

 string json = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);


4
var responseData = //Fetch Data
string jsonData = JsonConvert.SerializeObject(responseData, Formatting.None);
System.IO.File.WriteAllText(Server.MapPath("~/JsonData/jsondata.txt"), jsonData);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.