IDictionary<string,object>
は、KeyValuePair
オブジェクトの配列(例:[{Key:"foo", Value:"bar"}, ...]
)としてシリアル化されているようです。代わりにオブジェクトとしてシリアル化することはできますか(たとえば、{foo:"bar"}
)?JavaScriptSerializerを使用して辞書をシリアライズ
答えて
私はJavaScriptSerializerはがらくたであるとJson.Netがより良い選択肢であることに同意しますが、 JavaScriptSerializerを必要な方法で直列化できるようにする方法があります。 あなたは、コンバータを登録し、このようなものを使用してSerializeメソッドをオーバーライドする必要があります。
public class KeyValuePairJsonConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
var instance = Activator.CreateInstance(type);
foreach (var p in instance.GetType().GetPublicProperties())
{
instance.GetType().GetProperty(p.Name).SetValue(instance, dictionary[p.Name], null);
dictionary.Remove(p.Name);
}
foreach (var item in dictionary)
(instance).Add(item.Key, item.Value);
return instance;
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
var result = new Dictionary<string, object>();
var dictionary = obj as IDictionary<string, object>;
foreach (var item in dictionary)
result.Add(item.Key, item.Value);
return result;
}
public override IEnumerable<Type> SupportedTypes
{
get
{
return new ReadOnlyCollection<Type>(new Type[] { typeof(your_type) });
}
}
}
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() });
jsonOfTest = javaScriptSerializer.Serialize(test);
// {"x":"xvalue","y":"\/Date(1314108923000)\/"}
ホープ、このことができます!
あなたのクラスを使用しようとしていますが、 'Class Object'の' instance'変数にはaddメソッドがありません。 –
いいえ、JavaScriptSerializerではできません。それはJson.NETで可能です:その後、
public class Bar
{
public Bar()
{
Foos = new Dictionary<string, string>
{
{ "foo", "bar" }
};
}
public Dictionary<string, string> Foos { get; set; }
}
と:
var bar = new Bar();
string json = JsonConvert.SerializeObject(bar, new KeyValuePairConverter());
は希望を生み出す:
{"Foos":{"foo":"bar"}}
私は最初にそのルートに行っていた。以前の質問:http://stackoverflow.com/questions/6416017/json-net-deserializing-nested-dictionariesを参照してください。 Json.NETでネストされた辞書をデシリアライズする際に問題が発生しました。 – Daniel
@Daniel、Json.NETは 'JavaScriptSerializer'と比較して砂糖です。だからあなたがJson.NETに問題がある場合、私は代替案について何を言いたいのか分からない:-)あなたの他の質問に関しては、それは完全に正常な動作です。シリアライザに指示したのは、文字列とオブジェクトの辞書です。だからあなたは弱い型の辞書で作業しているのですが、何の代わりに期待していますか?あなたが得ることができるのは、弱く型付けされたJObjectsだけです。厳密に型付けされた辞書を使用してください: 'Dictionary
どのような違いがありますか?私はそれを見ていないよ。 – Daniel
私はJavaScriptSerializerを使用してそれを解決することができました。トリックは独自のコンバータを作成することです。次のコードは、コードを働いている:
public class KeyValuePairJsonConverter : JavaScriptConverter {
public override object Deserialize(IDictionary<string, object> dictionary
, Type type
, JavaScriptSerializer serializer) {
throw new InvalidOperationException("Sorry, I do serializations only.");
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) {
Dictionary<string, object> result = new Dictionary<string, object>();
Dictionary<string, MyClass> dictionaryInput = obj as Dictionary<string, MyClass>;
if (dictionaryInput == null) {
throw new InvalidOperationException("Object must be of Dictionary<string, MyClass> type.");
}
foreach (KeyValuePair<string, MyClass> pair in dictionaryInput)
result.Add(pair.Key, pair.Value);
return result;
}
public override IEnumerable<Type> SupportedTypes {
get {
return new ReadOnlyCollection<Type>(new Type[] { typeof(Dictionary<string, MyClass>) });
}
}
}
そして、ここでは、あなたがそれを使用する方法は次のとおりです。
JavaScriptSerializer js = new JavaScriptSerializer();
js.RegisterConverters(new JavaScriptConverter[] { new KeyValuePairJsonConverter() });
Context.Response.Clear();
Context.Response.ContentType = "application/json";
Context.Response.Write(js.Serialize(myObject));
ここで私はトーマスの答えからの改良版を信じています。魅力のように動作します。 ScriptIgnore属性のチェックを追加することもできますが、うまくいきません。
私の意見では、サードパーティーのソリューションはほとんど知られていないため、インストールに時間がかかり、しばしば忘れてしまった前提条件を忘れていて、事業に配備するのが危険なコピーライト状態になっていたからです。
P-S:私がなぜインスタンスとインスタンスの両方を辞書としてデシリアライズしようとしているのか分からなかったので、その部分を取り除いた。
public class KeyValuePairJsonConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> deserializedJSObjectDictionary, Type targetType, JavaScriptSerializer javaScriptSerializer)
{
Object targetTypeInstance = Activator.CreateInstance(targetType);
FieldInfo[] targetTypeFields = targetType.GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo fieldInfo in targetTypeFields)
fieldInfo.SetValue(targetTypeInstance, deserializedJSObjectDictionary[fieldInfo.Name]);
return targetTypeInstance;
}
public override IDictionary<string, object> Serialize(Object objectToSerialize, JavaScriptSerializer javaScriptSerializer)
{
IDictionary<string, object> serializedObjectDictionary = new Dictionary<string, object>();
FieldInfo[] objectToSerializeTypeFields = objectToSerialize.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo fieldInfo in objectToSerializeTypeFields)
serializedObjectDictionary.Add(fieldInfo.Name, fieldInfo.GetValue(objectToSerialize));
return serializedObjectDictionary;
}
public override IEnumerable<Type> SupportedTypes
{
get
{
return new ReadOnlyCollection<Type>(new Type[] { typeof(YOURCLASSNAME) });
}
}
}
私のPSノートについて。おそらくこれは型ではなく汎用の辞書型を指定できるようにすることでしたが、正直なところ、汎用辞書型を指定する点はありません。
私はLINQを選択してJavaScriptSerializerで解決することができた:
var dictionary = new Dictionary<int, string>();
var jsonOutput = new JavaScriptSerializer().Serialize(dictionary.Select(x => new { Id = x.Key, DisplayText = x.Value }));
これは複雑なケース(複雑な階層構造)では機能しませんが、単純なケースでは問題が解決されるため、JavaScriptSerializerやサードパーティのライブラリに定型句を追加しないようにしたい場合には、 –
私にとっては複雑な場合でも '.Serialize(辞書)'に変更してもうまくいきました。そのシンプルなJsonConvertはすぐに使えます。私はこの答えに+2を与えることができたらいいと思う –
- 1. 、シリアライズ辞書2.0
- 2. ServiceStack.Textシリアライズ辞書
- 3. シリアライズ.NETの辞書
- 4. RestSharp/ASP.NET WebApiを使用したカスタムJson辞書シリアライズ
- 5. Request.Formを辞書などにシリアライズ
- 6. クッキーの辞書をシリアライズするには?
- 7. Json.Netを使用して親オブジェクトの一部として辞書をシリアライズする方法
- 8. カスタム.NET XML辞書(キー、値)シリアライズ
- 9. WCF辞書<文字列、オブジェクト>シリアライズ
- 10. 使用カスタムオブジェクトとして辞書のキー
- 11. C#他の辞書内でTValueを使用している辞書
- 12. オフラインデータベースを使用したアンドロイド辞書アプリケーション
- 13. Json.Encode()はJavaScriptSerializerクラスを使用してシリアル化します
- 14. Json JavaScriptSerializerクラスを使用してエスケープしますか?
- 15. JavaScriptSerializerを使用して異常なJsonを解析する
- 16. 空の配列を辞書/オブジェクトにシリアライズして逆シリアル化する
- 17. IEqualityComparerを使用して辞書内のキーを検索
- 18. operator.itemgetterを使用して辞書を並べ替える
- 19. KVCを使用して辞書からプロパティ値を取得
- 20. 辞書をPythonのリストのキーと値を使用して
- 21. 辞書キーを使用して可変配列をソート
- 22. forループを使用して辞書を反復する
- 23. 辞書をJavaを使用して提供する
- 24. 辞書を使用してコドンを照合する
- 25. ToDictionaryを使用してソート済み辞書を作成する
- 26. J2MEを使用してモバイル辞書を作成する
- 27. linqを使用してリソースセットを辞書に変換する
- 28. グローバル辞書を使用して変数を作成する
- 29. ToDictionaryを使用して辞書を作成する
- 30. IPAddress列を使用してDataTableをシリアライズ
はい、JavaScriptSerializer、その全くがらくたを使用してはいけません。使用Newtonsoft Json.NET –