私はこれらのようなクラスがあります:
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文字列ライターを作成する以外に他のオプションはありますか?
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);
}
}
私たちはみんな一つのライナーが大好きだから
...これはNewtonsoft NuGetパッケージに依存しています。このパッケージは人気があり、デフォルトのシリアライザよりも優れています。
Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})
ドキュメント:JSONのシリアライズとデシリアライズ
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 );
うーん!本当に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文字列を受け取り、クラスのフィールドに値を設定するコンストラクタメソッドを実装します。
あなたがASP.NET MVC Webコントローラにいるならば、それは同じくらい簡単です:
string ladAsJson = Json(Lad);
誰もこれを述べていないとは信じられない。
それほど大きくない場合は、おそらく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);
}
これを実現するには、Newtonsoft.jsonを使用します。 NugetからNewtonsoft.jsonをインストールします。その後:
using Newtonsoft.Json;
var jsonString = JsonConvert.SerializeObject(obj);
このツール を使用してC#クラスを生成し、このコードを使用してオブジェクトをシリアル化します
var json = new JavaScriptSerializer().Serialize(obj);
XMLをJSONに変換するには、以下のコードを使用してください。
var json = new JavaScriptSerializer().Serialize(obj);
これと同じくらい簡単で、動的オブジェクト(typeオブジェクト)にも使えます。
string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);
ServiceStackのJSONシリアライザに投票します。
using ServiceStack.Text
string jsonString = new { FirstName = "James" }.ToJson();
また、.NETで利用可能な最速のJSONシリアライザです。 http://www.servicestack.net/benchmarks/
この本当に気の利いたユーティリティはここにあります: http://csharp2json.io/ /
シリアライザ
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
}
}