HashSet<string>
はJsonConvert.SerializeObject
です。配列にシリアライズします。Newtonsoft.Json.JsonConvertのコンターをHashSet/Dictionaryに使用するように設定します。
JsonConvert.DeserializeObject<HashSet<string>>
を使用してデシリアライズすると、同じ値の新しいHashSet<string>
が得られます。ただし、Comparer
はリセットされています。
// JSON settings
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
// Create a case insensitive hashset
var h = new HashSet<string>(new string[] {"A", "b"}, StringComparer.OrdinalIgnoreCase);
h.Contains("a"); // TRUE
// Serialise and deserialise with Newtonsoft.Json
string s = JsonConvert.SerializeObject(h, settings);
// s = ["A", "b"]
var newH = JsonConvert.DeserializeObject<HashSet<string>>(s, settings);
// Result is now case-sensitive
newH.Contains("a"); // FALSE
newH.Contains("A"); // TRUE
JsonConvert
は大文字と小文字が区別され、EqualityComparer<string>.Default
を使用するためです。
代わりにStringComparer.OrdinalIgnoreCase
を使用するように指示するにはどうすればよいですか?
シリアル化されたデータにHashSet<string>.Comparer
プロパティを含めることは望ましくありません(JSONでは単純な配列にする必要があります)、デシリアライズの時点で指定します。
JsonConvert.PopulateObject()
を使用することができ
乾杯(+1とANS)御馳走を働きました!私の質問の例は単純化され、 'HashSet'は本当にプロパティです。私はそれを以下のように変更しました: 'public HashSet PropName {get;セット; } =新しいHashSet (StringComparer.OrdinalIgnoreCase);そしてそれはうまくいった。 –
Keith
@Keith - サブクラス化する 'CustomCreationConverter'もオプションです。しかし、私は、コンストラクタでハッシュセットを事前に割り当てるといいと思います。 –
dbc