このようなオブジェクトモデルがあります。
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
に置き換えても同じ結果が得られるのでしょうか。どのようにこれをしますか?
ありがとう。
// you need to reference System.Web.Extensions
using System.Web.Script.Serialization;
var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);
注意してください。
時代は変わった、私は私の最初の選択のJSONパーサーとしてJSON.Netを使用することをデフォルトとする。それがWebAPIのための正しい選択なら、それは私のための正しい選択です。
例えば.
using Newtonsoft.Json;
var json = JsonConvert.SerializeObject(aList);
最初にパッケージをインストールする必要があるかもしれません。
PM> Install-Package Newtonsoft.Json
詳細については 、この情報の元になっている答え を参照してください。
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シリアライザでこれを行うには、一般的に2つの方法があります。
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出力を作成するためにオブジェクトに追加したデータ注釈を考慮に入れます。
How To:JSONデータをシリアライズおよびデシリアライズする で説明されているように、Jsonをストリームにシリアライズしたいデータクラスに既に注釈が付いている場合は便利です。制限はありますが、基本的なニーズがあり、「もう1つのライブラリ」をプロジェクトに追加したくない場合は、十分に高速で十分です。
次のコードは、コンソール出力ストリームへのリストをシリアライズします。ご覧のとおり、これはJson.NETより bit 冗長であり、タイプセーフではありません(つまり総称はありません)。
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の生成方法をはるかにうまく制御できます。 JavaScriptにやさしい名前を.NETクラスにマッピングしたり、日付をjsonにフォーマットしたりする必要がある場合に非常に便利です。
もう1つのオプションは、 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);
}
またはこのprocessへの呼び出し
{
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));
}