リストをJSONにシリアル化する


182

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

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、同じ結果を得ることができるかどうか疑問に思います。どうすればいいですか?

ありがとう。


WPFプロジェクトでは、System.Web.Extensions使用する参照を追加する必要があることに注意してください。stackoverflow.com/ a System.Web.Script.Serialization/ 18746092/1599699 stackoverflow.com/a/19299695/1599699
Andrew

回答:


338

.Net Core 3.0以降を使用している場合。

デフォルトでは、組み込みのSystem.Text.Jsonパーサー実装を使用します。

例えば

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

または、Utf8JsonパーサーやJilのように、主流ではない他のオプションも利用できます。これらは、本当に必要な場合に優れたパフォーマンスを提供しますが、それぞれのパッケージをインストールする必要があります。

.Net Core 2.2以前を使用してスタックした場合。

デフォルトでは、Newtonsoft JSON.Netを最初の選択肢のJSONパーサーとして使用します。

例えば

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(aList);

最初にパッケージをインストールする必要があるかもしれません。

PM> Install-Package Newtonsoft.Json

詳細については、この情報のソースである回答を参照して賛成票を投じてください

参考までに、これは何年も前の最初の答えでした。

// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;

var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);

1
ああ、そうですね、オブジェクト自体だけでなく、オブジェクトのリストもシリアル化します。ありがとう。
フランス語、2012

循環関係は好きではありませんが、ここでは問題ありません
Jodrell

13
この名前空間はSystem.Web.Extensionsに巧みに隠されていることに注意してください。それを参照として追加すると、ソリューションは見事に機能します。
Eight-Bit Guru 2013年

1
私はあなたの編集された答えを見て、本当に更新された例があったらいいのにと思います。
ディランBrams

1
@ IamNumber5はすでに他の回答で提供されています。とにかく答えを広げました。
Jodrell、2015年

111

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

ドキュメント:コレクションのシリアル化


12

組み込みの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;}
    }
    

5
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;
        }

4

.NETは、バージョン3.5以降、System.Runtime.Serialization.Json名前空間DataContractJsonSerializerクラスを介した基本的なJsonシリアル化をすでにサポートしています。名前が示すように、DataContractJsonSerializerは、オブジェクトに追加したすべてのデータアノテーションを考慮して、最終的なJson出力を作成します。

How To:Serialize and Deserialize JSON Dataで説明されているように、Jsonをストリームにシリアル化したい注釈付きのデータクラスが既にある場合に便利です。制限はありますが、基本的なニーズがあり、Yet Another Libraryをプロジェクトに追加したくない場合は、十分で高速です。

次のコードは、リストをコンソール出力ストリームにシリアライズします。ご覧のとおり、これはJson.NETより少し冗長であり、タイプセーフではありません(つまり、ジェネリックはありません)。

        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にフォーマットしたりする必要がある場合に非常に便利です。

別のオプションは 、ServicStack ...スタックの一部であるServiceStack.Textです。これは、Json、JSV、およびCSV用の非常に高速なシリアライザーのセットを提供します。


0

別の投稿からの回答に基づいて構築します。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);
}

またはこの処理を呼び出す

{
        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));
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.