.NET에서 C # 객체를 JSON 문자열로 바꾸려면 어떻게해야합니까?


944

나는 이런 수업을 가지고 있습니다 :

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

그리고 Lad객체를 다음 과 같이 JSON 문자열 로 바꾸고 싶습니다.

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}

(포맷없이). 이 링크를 찾았 지만 .NET 4에 없는 네임 스페이스를 사용합니다 . JSON.NET에 대해서도 들었습니다. 사이트가 다운 된 것 같습니다. 외부 DLL 파일을 사용하고 싶지 않습니다.

JSON 문자열 작성기를 수동으로 만드는 것 외에 다른 옵션이 있습니까?


2
JSON.net은 여기 에 로드 할 수 있습니다 . 또 다른 더 빠른 (내가 직접 테스트하지는 않았 음) 솔루션은 ServiceStack.Text 자신의 JSON 파서를 롤링하지 않는 것이 좋습니다. 속도가 느리고 오류가 발생하기 쉬우거나 많은 시간을 투자해야합니다.
Zebi

예. C #에는 JavaScriptSerializer라는 유형이 있습니다
Glenn Ferrie


2
흠 .. 내가 볼 수있는 한 msdn.microsoft.com/en-us/library/… 를 사용할 수 있어야 합니다. MSDN 페이지에 따라 .Net 4.0에도 있습니다. Serialize (Object obj) 메서드를 사용할 수 있어야합니다. msdn.microsoft.com/en-us/library/bb292287.aspx 여기에 뭔가 빠졌습니까? Btw. 링크는 링크가 아닌 일부 코드 인 것 같습니다
Holger

말할 것도없이 System.Web.Xyz 네임 스페이스에 의존하지 않습니다 ...
Dave Jellison

답변:


898

JavaScriptSerializer클래스를 사용할 수 있습니다 (에 참조 추가 System.Web.Extensions).

using System.Web.Script.Serialization;
var json = new JavaScriptSerializer().Serialize(obj);

전체 예 :

using System;
using System.Web.Script.Serialization;

public class MyDate
{
    public int year;
    public int month;
    public int day;
}

public class Lad
{
    public string firstName;
    public string lastName;
    public MyDate dateOfBirth;
}

class Program
{
    static void Main()
    {
        var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = new JavaScriptSerializer().Serialize(obj);
        Console.WriteLine(json);
    }
}

95
Microsoft는이 솔루션 대신 JSON.net을 사용하는 것이 좋습니다. 이 답변이 부적절하다고 생각합니다. willsteel의 답변을 살펴보십시오. 출처 : https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx .
rzelek

9
@DarinDimitrov에서는 JSON.net에 대한 힌트를 추가하는 것이 좋습니다. 마이크로 소프트는 JavascriptSerializer 이상을 권장합니다 msdn.microsoft.com/en-us/library/... 당신은 또한에 힌트를 추가 할 수 msdn.microsoft.com/en-us/library/... 프레임 워크에 포함 접근이다
Mafii

여기에 있습니다 온라인 도구 귀하의 변환 classesjson형식, 희망이 사람을 도움이.
shaijut

6
Microsoft가 타사 솔루션을 권장하는 이유는 무엇입니까? "Json.NET은 직렬화 및 역 직렬화를 사용해야합니다. AJAX 가능 응용 프로그램을위한 직렬화 및 역 직렬화 기능을 제공합니다."
Protector one

1
를 참조하려면 시스템에 설치되어 있거나 설치되어 System.Web.Extensions있어야합니다 . 이 stackoverflow.com/questions/7723489/…를 참조하십시오ASP.NET AJAX 1.0ASP.NET 3.5
Sisir

1055

우리 모두는 하나의 라이너를 사랑하기 때문에

... 이것은 Newtonsoft NuGet 패키지에 의존하는데, 이것은 기본 시리얼 라이저보다 널리 사용됩니다.

Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})

설명서 : JSON 직렬화 및 역 직렬화


134
Newtonsoft 시리얼 라이저는 더욱 빠르고 사용자 정의가 가능하며 내장되어 있습니다. 답변 주셔서 감사합니다 @willsteel
Andrei

8
@JosefPfleger 가격은 JSON.NET이 아닌 JSON.NET 스키마에 대한 것입니다. 일반 직렬 변환기는 MIT입니다
David Cumps

1
내 테스트에 따르면 Newtonsoft는 JavaScriptSerializer 클래스보다 느립니다. (.NET 4.5.2)
nemke

31
JavaScriptSerializer 에 대한 MSDN 설명서를 읽으면 JSON.net 사용이라고 표시됩니다.
dsghi

3
@JosefPfleger Newtionsoft JSON.net은 MIT 라이센스가 부여되어 있습니다. 원하는대로 수정하고 재판매 할 수 있습니다. 그들의 가격 페이지는 상업적인 기술 지원과 그들이 가지고있는 일부 스키마 검사기에 관한 것입니다.
cb88

95

Json.Net 사용 라이브러리를 하면 Nuget Packet Manager에서 다운로드 할 수 있습니다.

Json String으로 직렬화 :

 var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

객체를 역 직렬화 :

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );

57

다음 DataContractJsonSerializer클래스를 사용하십시오 . MSDN1 , MSDN2 .

나의 예 : 여기 .

와 달리 JSON 문자열에서 객체를 안전하게 역 직렬화 할 수도 있습니다 JavaScriptSerializer. 그러나 개인적으로 나는 여전히 Json.NET을 선호 합니다 .


1
여전히 그 페이지 에 어떤 예제도 보이지 않지만 여기에 MSDN다른 곳이 있습니다 -> 마지막 하나는 확장 방법을 사용하여 하나의 라이너를 만듭니다.
Cristian Diaconescu

아, 제 2 MSDN 링크 : 놓친
크리스티안 디아 코네스 쿠

2
일반 클래스를 직렬화하지 않습니다. "DataContractAttribute 특성으로 표시하고 DataMemberAttribute 특성으로 직렬화하려는 모든 멤버를 표시하십시오. 유형이 콜렉션 인 경우 CollectionDataContractAttribute로 표시하는 것이 좋습니다."오류가보고되었습니다.
Michael Freidgeim

@MichaelFreidgeim 맞습니다. 속성으로 직렬화하려는 클래스의 속성을 표시해야합니다. DataContractAttribute DataMemberAttribute
Edgar

1
@MichaelFreidgeim 더 나은 요구 사항에 따라 다릅니다. 속성을 사용하면 속성의 직렬화 방법을 구성 할 수 있습니다.
Edgar

24

Newtonsoft.json을 사용하여이를 달성 할 수 있습니다. NuGet에서 Newtonsoft.json을 설치하십시오. 그리고:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

22

우우! JSON 프레임 워크를 사용하는 것이 훨씬 좋습니다. :)

다음은 Json.NET을 사용하는 예입니다 ( http://james.newtonking.com/json ).

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.IO;

namespace com.blogspot.jeanjmichel.jsontest.model
{
    public class Contact
    {
        private Int64 id;
        private String name;
        List<Address> addresses;

        public Int64 Id
        {
            set { this.id = value; }
            get { return this.id; }
        }

        public String Name
        {
            set { this.name = value; }
            get { return this.name; }
        }

        public List<Address> Addresses
        {
            set { this.addresses = value; }
            get { return this.addresses; }
        }

        public String ToJSONRepresentation()
        {
            StringBuilder sb = new StringBuilder();
            JsonWriter jw = new JsonTextWriter(new StringWriter(sb));

            jw.Formatting = Formatting.Indented;
            jw.WriteStartObject();
            jw.WritePropertyName("id");
            jw.WriteValue(this.Id);
            jw.WritePropertyName("name");
            jw.WriteValue(this.Name);

            jw.WritePropertyName("addresses");
            jw.WriteStartArray();

            int i;
            i = 0;

            for (i = 0; i < addresses.Count; i++)
            {
                jw.WriteStartObject();
                jw.WritePropertyName("id");
                jw.WriteValue(addresses[i].Id);
                jw.WritePropertyName("streetAddress");
                jw.WriteValue(addresses[i].StreetAddress);
                jw.WritePropertyName("complement");
                jw.WriteValue(addresses[i].Complement);
                jw.WritePropertyName("city");
                jw.WriteValue(addresses[i].City);
                jw.WritePropertyName("province");
                jw.WriteValue(addresses[i].Province);
                jw.WritePropertyName("country");
                jw.WriteValue(addresses[i].Country);
                jw.WritePropertyName("postalCode");
                jw.WriteValue(addresses[i].PostalCode);
                jw.WriteEndObject();
            }

            jw.WriteEndArray();

            jw.WriteEndObject();

            return sb.ToString();
        }

        public Contact()
        {
        }

        public Contact(Int64 id, String personName, List<Address> addresses)
        {
            this.id = id;
            this.name = personName;
            this.addresses = addresses;
        }

        public Contact(String JSONRepresentation)
        {
            //To do
        }
    }
}

시험:

using System;
using System.Collections.Generic;
using com.blogspot.jeanjmichel.jsontest.model;

namespace com.blogspot.jeanjmichel.jsontest.main
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Address> addresses = new List<Address>();
            addresses.Add(new Address(1, "Rua Dr. Fernandes Coelho, 85", "15º andar", "São Paulo", "São Paulo", "Brazil", "05423040"));
            addresses.Add(new Address(2, "Avenida Senador Teotônio Vilela, 241", null, "São Paulo", "São Paulo", "Brazil", null));

            Contact contact = new Contact(1, "Ayrton Senna", addresses);

            Console.WriteLine(contact.ToJSONRepresentation());
            Console.ReadKey();
        }
    }
}

결과:

{
  "id": 1,
  "name": "Ayrton Senna",
  "addresses": [
    {
      "id": 1,
      "streetAddress": "Rua Dr. Fernandes Coelho, 85",
      "complement": "15º andar",
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": "05423040"
    },
    {
      "id": 2,
      "streetAddress": "Avenida Senador Teotônio Vilela, 241",
      "complement": null,
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": null
    }
  ]
}

이제 JSON 문자열을 받고 클래스의 필드를 채우는 생성자 메서드를 구현하겠습니다.


1
좋은 소식입니다. 가장 최신 방법입니다.
MatthewD

20

System.Text.Json네임 스페이스 에서 새로운 JSON 시리얼 라이저를 사용할 수 있습니다 . .NET Core 3.0 공유 프레임 워크에 포함되어 있으며 NuGet 패키지에 있습니다. .NET Standard 또는 .NET Framework 또는 .NET Core 2.x를 대상으로하는 프로젝트를위한 에 있습니다.

예제 코드 :

using System;
using System.Text.Json;

public class MyDate
{
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
}

public class Lad
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public MyDate DateOfBirth { get; set; }
}

class Program
{
    static void Main()
    {
        var lad = new Lad
        {
            FirstName = "Markoff",
            LastName = "Chaney",
            DateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = JsonSerializer.Serialize(lad);
        Console.WriteLine(json);
    }
}

이 예제에서 직렬화 할 클래스에는 필드가 아닌 속성이 있습니다. 그만큼System.Text.Json시리얼 라이저는 현재 없습니다 직렬화 필드를한다.

선적 서류 비치:


9

크기가 크지 않으면 JSON으로 내보내는 경우가 무엇입니까?

또한 이것은 모든 플랫폼에서 이식 가능합니다.

using Newtonsoft.Json;

[TestMethod]
public void ExportJson()
{
    double[,] b = new double[,]
        {
            { 110,  120,  130,  140, 150 },
            {1110, 1120, 1130, 1140, 1150},
            {1000,    1,   5,     9, 1000},
            {1110,    2,   6,    10, 1110},
            {1220,    3,   7,    11, 1220},
            {1330,    4,   8,    12, 1330}
        };

    string jsonStr = JsonConvert.SerializeObject(b);

    Console.WriteLine(jsonStr);

    string path = "X:\\Programming\\workspaceEclipse\\PyTutorials\\src\\tensorflow_tutorials\\export.txt";

    File.WriteAllText(path, jsonStr);
}

8

ASP.NET MVC 웹 컨트롤러에 있다면 다음과 같이 간단합니다.

string ladAsJson = Json(Lad);

아무도 이것을 언급하지 않았다는 것을 믿을 수 없습니다.


1
jsonresult를 문자열로 캐스트 할 수 없다는 오류가 발생합니다.
csga5000

암시 적 입력으로 컴파일합니다 : var ladAsJson = Json (Lad).
ewomack

3

ServiceStack의 JSON Serializer에 투표하겠습니다.

using ServiceStack.Text

string jsonString = new { FirstName = "James" }.ToJson();

또한 .NET에서 사용할 수있는 가장 빠른 JSON 시리얼 라이저입니다 : http://www.servicestack.net/benchmarks/


4
그것들은 매우 오래된 벤치 마크입니다. 방금 세 가지 최신 버전의 Newtonsoft, ServiceStack 및 JavaScriptSerializer를 모두 테스트했으며 현재 Newtonsoft가 가장 빠릅니다. 그들은 모두 매우 빨리합니다.
Michael Logutov

1
ServiceStack은 무료가 아닙니다.
joelnet

@ joelnet이 경우에 해당하지만 질문에 답변 할 때 무료였습니다. 그러나 소규모 사이트에는 무료이며 유료 임에도 불구하고 여전히 사용하고 있으며 훌륭한 프레임 워크입니다.
James

여기에는 몇 가지 벤치 마크가 있지만 직렬화에는 그 자체가 없습니다 : docs.servicestack.net/real-world-performance
JohnLBevan

3

XML을 JSON으로 변환하려면 아래 코드를 사용하십시오.

var json = new JavaScriptSerializer().Serialize(obj);


3

다음과 같이 쉽습니다 (동적 객체에서도 작동합니다 (유형 객체)).

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);

웹에는 기본 스크립트가 없습니다. :(
M at

당신은 이것을 찾고 있습니다 : msdn.microsoft.com/en-us/library/…
MarzSocks

나는 그것을 시도했지만 아니. 스크립트 참조로 추가해야한다고 생각합니다. 감사합니다
M :

0

시리얼 라이저

 public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite, new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
        });
        using (var writer = new StreamWriter(filePath, append))
        {
            writer.Write(contentsToWriteToFile);
        }
}

목적

namespace MyConfig
{
    public class AppConfigurationSettings
    {
        public AppConfigurationSettings()
        {
            /* initialize the object if you want to output a new document
             * for use as a template or default settings possibly when 
             * an app is started.
             */
            if (AppSettings == null) { AppSettings=new AppSettings();}
        }

        public AppSettings AppSettings { get; set; }
    }

    public class AppSettings
    {
        public bool DebugMode { get; set; } = false;
    }
}

이행

var jsonObject = new AppConfigurationSettings();
WriteToJsonFile<AppConfigurationSettings>(file.FullName, jsonObject);

산출

{
  "AppSettings": {
    "DebugMode": false
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.