sourcetip

JSON에 목록 직렬화

fileupload 2023. 3. 29. 21:46
반응형

JSON에 목록 직렬화

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

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같은 결과를 얻을 수 있습니다.이거 어떻게 해요?

를 사용하는 경우.Net Core 3.0 이후

기본 제공 사용System.Text.Json파서의 실장.

예.

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

또는 Utf8Json 파서 및 Jil과 같은 덜 메인스트림 옵션을 사용할 수 있습니다.꼭 필요한 경우 뛰어난 성능을 제공할 수 있지만 각각의 패키지를 설치해야 합니다.

를 사용하여 고착된 경우.Net Core 2.2 이전 버전

기본적으로는 Newtonsoft JSON을 사용합니다.넷을 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);

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

그런 다음 목록(또는 원하는 개체)을 다음과 같이 직렬화합니다.

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

업데이트: NuGet Package Manager(도구 --> NuGet Package Manager --> 패키지 매니저 콘솔)를 사용하여 프로젝트에 추가할 수도 있습니다.

PM> Install-Package Newtonsoft.Json

문서:컬렉션 시리얼화

임베디드 JSON 시리얼라이저를 사용하는 경우는, 다음의 2개의 일반적인 방법이 있습니다.

  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;}
    }
    
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;
        }

.NET은 이미 시스템을 통한 기본적인 Json 직렬화를 지원합니다.런타임시리얼화버전 3.5 이후의 Json 네임스페이스 및 DataContractJsonSerializer 클래스.이름에서 알 수 있듯이 DataContractJsonSerializer는 개체에 추가한 모든 데이터 주석을 고려하여 최종 Json 출력을 만듭니다.

방법은 "JSON 데이터 직렬화역직렬화 방법"에서 설명한 대로 스트림에 JSON을 직렬화하려는 주석 첨부 데이터 클래스가 이미 있는 경우 유용합니다.제한은 있지만 기본적인 요구가 있고 프로젝트에 Yet Another Library를 추가하지 않으면 충분하고 빠릅니다.

다음 코드는 콘솔 출력 스트림에 목록을 직렬화합니다.보다시피 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을 생성하는 방법을 훨씬 더 잘 제어합니다.이것은 javascript에 친숙한 이름을 에 매핑해야 할 때 매우 유용합니다.NET 클래스, 날짜를 json으로 포맷하는 등

다른 옵션은 ServiceStack입니다.ServiceStack ... 스택의 일부인 텍스트. Json, JSV 및 CSV용 고속 시리얼라이저 세트를 제공합니다.

다른 게시물로부터의 답변을 바탕으로 하고 있습니다.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));
}

만약 당신이 이것을 asp의 맥락에서 한다면.Net Core API 액션, Json으로의 변환은 암묵적으로 이루어집니다.

[HttpGet]
public ActionResult Get()
{
    return Ok(TheList);
}
using System;
  using System.Text.Json;   
  using System.Collections.Generic;

    public class Program
    {
        public static void Main()
        {
            
            List<ErrorDetail>  aList = new List<ErrorDetail>();
            ErrorDetail a = new  ErrorDetail{ ColumnName="aaa", ErrorText="abbbb"};
            ErrorDetail c = new  ErrorDetail{ ColumnName="ccc", ErrorText="cccc"};
            ErrorDetail b = new  ErrorDetail{ ColumnName="ccc", ErrorText="cccc"};
            aList.Add(a);
            aList.Add(b);
            aList.Add(c);
            
            var json = JsonSerializer.Serialize(aList);
            
            Console.WriteLine(json);
        }
        
        public class ErrorDetail
        {
           
            public string ColumnName { get; set; }
    
           
            public string ErrorText { get; set; }
    
    
    
    
        }
    }

POST 요청의 파라미터를 시리얼화하기 위해 여기서 다른 응답을 시도했지만, 백엔드는 어레이의 문자열 버전을 전송하고 있는 것을 좋아하지 않았습니다.파라미터의 유형이 문자열인지 확인하고 배열로 변환할 필요가 없었습니다.

Json을 쓰고 있어요.NET(현재는 C#에 내장되어 있습니다), 리스트를 어레이로 변환하고 나머지는 컨버터가 처리합니다.

public class MyObjectInJson 
{
    public long ID;
    public OtherObject[] array;
}

할 수 .list.ToArray();

으로 '아예'를 사용해서JsonConvert오브젝트 전체를 문자열로 변환할 수 있습니다.

string jsonString = JsonConvert.SerializeObject(objectInJson);

이게 다른 사람에게 도움이 되길 바라.

언급URL : https://stackoverflow.com/questions/9110724/serializing-a-list-to-json

반응형