質問
linqを使用して、ajax呼び出しからJsonとして返される特定の形状にデータのリストを整形しようとしています。
このデータを指定:
var data = new List<string>();
data.Add("One");
data.Add("Two");
data.Add("Three");
そしてこのコード:**これは正しくなく、修正が必要なものです!! **
var shaped = data.Select(c =>
new { c = c }
).ToList();
serializer.Serialize(shaped,sb);
string desiredResult = sb.ToString();
desiredResult
を次のようにしたい:
{
"One": "One",
"Two": "Two",
"Three": "Three"
}
しかし、現在は:
{&quot; c&quot; :&quot; One&quot; }、{&quot; c&quot; :&quot; Two&quot; }
など。
1つの問題は、オブジェクト初期化子の左側で、 c
自体の値ではなく、 c
の値が必要なことです...
解決
ソリューションは、パフォーマンスではなく正確さのために提供されています。
List<string> data = new List<string>()
{
"One",
"Two",
"Three"
};
string result =
"{ "
+
string.Join(", ", data
.Select(c => @"""" + c + @""": """ + c + @"""")
.ToArray()
) + " }";
他のヒント
jsonでは、&quot; c&quot; &quot; c&quot; :&quot; One&quot;プロパティ名です。 C#の世界では、プロパティ名をその場で作成することはできません(System.ComponentModelを無視します)。
基本的に、あなたがやりたいことはできないと思います。
JSON.NET の使用はどうですか?
他のすべての回答が基本的に間違っているか不完全であるという理由だけで、この古い質問に回答しています。
JSONは非常に単純なので、基本的に、目的のJSONを取得するには、JSON配列の違いだけを把握する必要があります。
["one", "two", "three"]
およびJSONオブジェクト/辞書(オブジェクトと辞書は実際には同じです):
{"a": "one", "b": "two", "c": 3}
&quot; c&quot;に注意してください。要素のタイプは異なりますが、これはJavascriptの問題ではありません。
これを考えると、.NETで使用するほとんどすべてのシリアライザー(ほとんどの場合、 JSON.NET ライブラリ)は、.NETオブジェクトまたは.NET辞書をJSONオブジェクトに変換します。
したがって、必要なのは、リストを辞書に変換してから、シリアライザーに辞書またはオブジェクトを供給することです。 もう1つの質問は、キーと等しい値を持つ辞書が必要な理由ですが、私はかなり疑わしいとしても、その点を受け入れます。
例:
List<string> source = new List<string>() { "a", "b", "c" };
Dictionary<string, string> dict = source.ToDictionary(el => el, el => el);
var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(dict);
// jsonString should be "{'a':'a', 'b':'b', 'c':'c'}", with more or less whitespace depending on formatting