web-dev-qa-db-ja.com

リストをJSONに直列化する

このようなオブジェクトモデルがあります。

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に置き換えても同じ結果が得られるのでしょうか。どのようにこれをしますか?

ありがとう。

161
frenchie
// 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

詳細については 、この情報の元になっている答え を参照してください。

295
Jodrell

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

ドキュメンテーション:コレクションの直列化

98
Brent Barbata

組み込みのJSONシリアライザでこれを行うには、一般的に2つの方法があります。

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(TheList);
    
  2. DataContractJsonSerializer

    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;}
    }
    
11
Joulukuusi
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;
        }
5
samsanthosh2008

.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用の非常に高速なシリアライザのセットを提供します。 。

4

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));
}
0
Joseph Poirier