목록을 JSON으로 직렬화


182

다음과 같은 객체 모델이 있습니다.

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}

이 속성 ObjectInJson은 중첩 된 목록이 포함 된 개체의 이미 직렬화 된 버전입니다. 현재로서는 다음 MyObjectInJson과 같이 수동으로 목록을 직렬화하고 있습니다.

StringBuilder TheListBuilder = new StringBuilder();

TheListBuilder.Append("[");
int TheCounter = 0;

foreach (MyObjectInJson TheObject in TheList)
{
  TheCounter++;
  TheListBuilder.Append(TheObject.ObjectInJson);

  if (TheCounter != TheList.Count())
  {
    TheListBuilder.Append(",");
  }
}
TheListBuilder.Append("]");

return TheListBuilder.ToString();

이런 종류의 위험한 코드를 대체 JavascriptSerializer하고 동일한 결과를 얻을 수 있는지 궁금합니다 . 어떻게해야합니까?

감사.


WPF 프로젝트에서 System.Web.Extensions사용할 참조를 추가해야 합니다 System.Web.Script.Serialization. stackoverflow.com/a/18746092/1599699 stackoverflow.com/a/19299695/1599699
Andrew

답변:


338

.Net Core 3.0 이상을 사용하는 경우

기본적으로 내장 System.Text.Json구문 분석기 구현 을 사용합니다 .

예 :

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

또는 Utf8Json 파서 및 Jil 과 같은 주류가 아닌 다른 옵션을 사용할 수 있습니다. 실제로 필요한 경우 우수한 성능을 제공 할 수 있지만 해당 패키지를 설치해야합니다.

.Net Core 2.2 또는 이전 버전을 사용하여 고정 된 경우

기본적으로 Newtonsoft JSON.Net을 첫 번째 선택 JSON 파서로 사용합니다.

예 :

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(aList);

패키지를 먼저 설치해야 할 수도 있습니다.

PM> Install-Package Newtonsoft.Json

자세한 내용 은이 정보의 출처 인 답변을 참조하십시오 .

참고로 이것은 몇 년 전의 원래의 대답이었습니다.

// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;

var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);

1
아, 그것은 또한 객체 자체뿐만 아니라 객체 목록을 직렬화합니다. 감사.
frenchie

주기적 관계를 좋아하지 않지만 여기서는 문제가되지 않습니다
Jodrell

13
이 네임 스페이스는 System.Web.Extensions에서 교묘하게 숨겨져 있습니다. 이것을 참조로 추가하면 솔루션이 훌륭하게 작동합니다!
8 비트 전문가

1
편집 한 답변을보고 업데이트 된 예가 있으면 좋겠습니다.
Dylan Brams

1
@ IamNumber5는 이미 다른 답변에 제공되어 있습니다. 어쨌든 나는 대답을 확장했다.
Jodrell

111

Json.NET을 사용할 수도 있습니다. http://james.newtonking.com/pages/json-net.aspx 에서 다운로드 하고 압축 파일을 추출하여 참조로 추가하십시오.

그런 다음 다음과 같이 목록 (또는 원하는 객체)을 직렬화하십시오.

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

업데이트 : NuGet 패키지 관리자 (도구-> NuGet 패키지 관리자-> 패키지 관리자 콘솔)를 통해 프로젝트에 추가 할 수도 있습니다.

PM> Install-Package Newtonsoft.Json

문서 : 컬렉션 직렬화


12

내장 JSON 직렬 변환기를 사용하여 수행하는 일반적인 두 가지 방법이 있습니다.

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(TheList);
  2. DataContractJsonSerializer

    var serializer = new DataContractJsonSerializer(TheList.GetType());
    using (var stream = new MemoryStream())
    {
        serializer.WriteObject(stream, TheList);
        using (var sr = new StreamReader(stream))
        {
            return sr.ReadToEnd();
        }
    }

    이 옵션을 사용하려면 클래스에 대한 데이터 계약을 정의해야합니다.

    [DataContract]
    public class MyObjectInJson
    {
       [DataMember]
       public long ObjectID {get;set;}
       [DataMember]
       public string ObjectInJson {get;set;}
    }

5
public static string JSONSerialize<T>(T obj)
        {
            string retVal = String.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                serializer.WriteObject(ms, obj);
                var byteArray = ms.ToArray();
                retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
            }
            return retVal;
        }

4

.NET은 이미 버전 3.5 이후 의 System.Runtime.Serialization.Json 네임 스페이스DataContractJsonSerializer 클래스를 통해 기본 Json 직렬화를 지원합니다 . 이름에서 알 수 있듯이 DataContractJsonSerializer는 객체에 추가 한 데이터 주석을 고려하여 최종 Json 출력을 만듭니다.

방법 : JSON 데이터 직렬화 및 역 직렬화에 설명 된대로 Json을 스트림으로 직렬화하려는 주석이 달린 데이터 클래스가 이미있는 경우 유용 할 수 있습니다 . 한계가 있지만 기본 요구 사항이 있고 프로젝트에 다른 라이브러리를 추가하지 않으려는 경우 충분하고 빠릅니다.

다음 코드는 목록을 콘솔 출력 스트림으로 직렬화합니다. 보시다시피 Json.NET보다 조금 더 장황하고 형식 안전하지 않습니다 (즉, 제네릭 없음)

        var list = new List<string> {"a", "b", "c", "d"};

        using(var output = Console.OpenStandardOutput())                
        {                
            var writer = new DataContractJsonSerializer(typeof (List<string>));
            writer.WriteObject(output,list);
        }

반면에 Json.NET 은 Json 생성 방법을 훨씬 더 잘 제어 할 수 있습니다. 이것은 자바 스크립트 친화적 인 이름 이름을 .NET 클래스에 매핑하고 날짜 형식을 json 등으로 매핑해야 할 때 매우 편리합니다.

또 다른 옵션은 ServicStack ... 스택의 일부인 ServiceStack.Text 이며 Json, JSV 및 CSV를위한 매우 빠른 시리얼 라이저 세트를 제공합니다.


0

Json.NET 버전 12.x에서 동적 검색을 사용하여 목록을 작성하는보다 일반적인 방법을 생각해 냈습니다.

using Newtonsoft.Json;

static class JsonObj
{
    /// <summary>
    /// Deserializes a json file into an object list
    /// Author: Joseph Poirier 2/26/2019
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static List<T> DeSerializeObject<T>(string fileName)
    {
        List<T> objectOut = new List<T>();

        if (string.IsNullOrEmpty(fileName)) { return objectOut; }

        try
        {
            // reading in full file as text
            string ss = File.ReadAllText(fileName);

            // went with <dynamic> over <T> or <List<T>> to avoid error..
            //  unexpected character at line 1 column 2
            var output = JsonConvert.DeserializeObject<dynamic>(ss);

            foreach (var Record in output)
            {
                foreach (T data in Record)
                {
                    objectOut.Add(data);
                }
            }
        }
        catch (Exception ex)
        {
            //Log exception here
            Console.Write(ex.Message);
        }

        return objectOut;
    }
}

처리 요청

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = JsonObj.DeSerializeObject<string>(fname);
}

이 처리 요청

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = new List<string>();
        jsonFile.AddRange(JsonObj.DeSerializeObject<string>(fname));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.