web-dev-qa-db-ja.com

.NETでC#オブジェクトをJSON文字列に変換する方法

私はこれらのようなクラスがあります:

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文字列ライターを作成する以外に他のオプションはありますか?

766
Hui

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);
    }
}
764
Darin Dimitrov

私たちはみんな一つのライナーが大好きだから

...これはNewtonsoft NuGetパッケージに依存しています。このパッケージは人気があり、デフォルトのシリアライザよりも優れています。

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

ドキュメント:JSONのシリアライズとデシリアライズ

798
willsteel

Json.Net libraryを使用すると、Nuget Packet 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 );
56
Gokulan P H

DataContractJsonSerializerクラスを使用します: MSDN1MSDN2

私の例: _ here _

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

53
Edgar

うーん!本当に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文字列を受け取り、クラスのフィールドに値を設定するコンストラクタメソッドを実装します。

21
Jean J. Michel

あなたがASP.NET MVC Webコントローラにいるならば、それは同じくらい簡単です:

string ladAsJson = Json(Lad);

誰もこれを述べていないとは信じられない。

4
micahhoover

それほど大きくない場合は、おそらく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);
    }
3
user8426627

これを実現するには、Newtonsoft.jsonを使用します。 NugetからNewtonsoft.jsonをインストールします。その後:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);
3
Waleed Naveed

このツール を使用してC#クラスを生成し、このコードを使用してオブジェクトをシリアル化します

 var json = new JavaScriptSerializer().Serialize(obj);
2
Artem Polischuk

XMLをJSONに変換するには、以下のコードを使用してください。

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

これと同じくらい簡単で、動的オブジェクト(typeオブジェクト)にも使えます。 

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

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

using ServiceStack.Text

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

また、.NETで利用可能な最速のJSONシリアライザです。 http://www.servicestack.net/benchmarks/

1
James

この本当に気の利いたユーティリティはここにあります: http://csharp2json.io/ /

0
jallen

シリアライザ

 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
  }
}
0
C0r3yh