다음과 같은 객체 모델이 있습니다.
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.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);
답변
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
문서 : 컬렉션 직렬화
답변
내장 JSON 직렬 변환기를 사용하여 수행하는 일반적인 두 가지 방법이 있습니다.
-
var serializer = new JavaScriptSerializer(); return serializer.Serialize(TheList);
-
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은 이미 버전 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를위한 매우 빠른 시리얼 라이저 세트를 제공합니다.
답변
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));
}