.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ここに何か不足していますか?ところで リンクはコードではなくリンクのようです
Holger

言うまでもなく、それはSystem.Web.Xyz名前空間に依存していません...
Dave Jellison

回答:


899

次の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
マイクロソフトでは、このソリューションの代わりにJSON.netを使用することを推奨していることを覚えておいてください。この答えは不適切になったと思います。willsteelの答えを見てください。ソース:https : //msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
rzelek、2016

9
@DarinDimitrovには、JSON.netに関するヒントを追加することを検討してください。MicrosoftはJavascriptSerializerの上にそれをお勧めします。msdn.microsoft.com/en-us/library/...あなたはまたにヒントを追加することができmsdn.microsoft.com/en-us/library/...フレームワークに含まアプローチである
Mafii

ここにあるオンラインツール、あなたの変換するためclassesjsonフォーマットは、希望は誰かに役立ちます。
シャイユット2017年

6
マイクロソフトがサードパーティのソリューションを推奨するのはなぜですか?「Json.NETはシリアライゼーションとデシリアライゼーションを使用する必要があります。AJAX対応アプリケーションにシリアライゼーションとデシリアライゼーション機能を提供します。」
プロテクター1

1
ただ、ヘッドアップは、を参照するにSystem.Web.Extensionsは、次のものが必要ASP.NET AJAX 1.0か、ASP.NET 3.5システムにインストールされています。このstackoverflow.com/questions/7723489/…を
Sisir

1056

私たちはみんなワンライナーが大好きなので

...これは、人気がありデフォルトのシリアライザよりも優れている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 2015

31
JavaScriptSerializerのMSDNドキュメントを読むと、JSON.netを使用すると書かれています。
dsghi 2015年

3
@JosefPfleger Newtionsoft JSON.netはMITライセンスです...変更を加えて、希望どおりに再販することができます。彼らの価格設定ページは、商業的な技術サポートと、彼らが持っているいくつかのスキーマバリデーターに関するものです。
cb88

95

Json.Netを使用するライブラリを Managerからダウンロードできます。

Json文字列へのシリアル化:

 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クラスを使用します:MSDN1MSDN2

私の例:ここ

とは異なり、JSON文字列からオブジェクトを安全にデシリアライズすることもできますJavaScriptSerializer。しかし、個人的には私はまだJson.NETを好みます


1
それでもそのページには例はありませんが、MSDNその他の場所にいくつかあります。 >最後の例では、拡張メソッドを使用してワンライナーを実現しています。
クリスティアンディアコネスク2015年

ああ、私は2番目のMSDNリンクを逃しました:)
Cristian Diaconescu '19年

2
プレーンクラスをシリアル化しません。エラーは、「DataContractAttribute属性でそれをマークし、DataMemberAttribute属性でシリアル化するすべてのメンバーをマークすることを検討してください。タイプがコレクションの場合は、CollectionDataContractAttributeでマークすることを検討してください。」
Michael Freidgeim 2016

@MichaelFreidgeimそうです、属性でシリアル化したいクラスのプロパティをマークする必要があります。DataContractAttribute DataMemberAttribute
Edgar

1
@MichaelFreidgeimどちらが良いかは要件によって異なります。属性を使用すると、プロパティのシリアル化方法を構成できます。
エドガー

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 2016年

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 Webコントローラーを使用している場合は、次のように簡単です。

string ladAsJson = Json(Lad);

誰もこれについて言及していないとは信じられない。


1
jsonresultを文字列にキャストできないというエラーが表示されます。
csga5000 2016

暗黙の型指定でコンパイルされます:var ladAsJson = Json(Lad)。
ewomack

3

ServiceStackのJSONシリアライザーに投票します。

using ServiceStack.Text

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

.NETで利用できる最速のJSONシリアライザーでもあります。http//www.servicestack.net/benchmarks/


4
それらは非常に古いベンチマークです。Newtonsoft、ServiceStack、JavaScriptSerializerの現在の3つのバージョンすべてをテストしたところ、現在Newtonsoftが最速です。Tho彼らはすべて非常に速く行います。
Michael Logutov 2013年

1
ServiceStackは無料ではないようです。
joelnet 2013

@joelnetがこれに該当しますが、質問に答えるときには無料でした。ただし、小規模なサイトでは無料で、有料でも引き続き使用していますが、すばらしいフレームワークです。
ジェームズ

ここにはいくつかのベンチマークがありますが、それ自体でシリアライゼーションを行うことはできません
JohnLBevan

3

以下のコードを使用して、XMLをJSONに変換します。

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


3

これは簡単です(動的オブジェクト(タイプオブジェクト)でも機能します)。

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

Webの下にはデフォルトのスクリプトはありません。:(
M:

あなたはこのを探しています: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.