[解決済み] JSON.Net 4.0でのJObjectとJPropertyの使い方
2022-02-27 15:23:07
質問
このフォーマットでJSONをデシリアライズしようとしています。
{
"data": [
{
"installed": 1,
"user_likes": 1,
"user_education_history": 1,
"friends_education_history": 1,
"bookmarked": 1
}
]
}
をこのような単純な文字列配列に変換します。
{
"installed",
"user_likes",
"user_education_history",
"friends_education_history",
"bookmarked"
}
を使って
JSON.NET 4.0
CustomCreationConverter'を使って動作させることができました。
public class ListConverter : CustomCreationConverter<List<string>>
{
public override List<string> Create(Type objectType)
{
return new List<string>();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var lst = new List<string>();
//don't care about the inital 'data' element
reader.Read();
while (reader.Read())
{
if (reader.TokenType == JsonToken.PropertyName)
{
lst.Add(reader.Value.ToString());
}
}
return lst;
}
}
しかし、これは本当にやりすぎだと思います。特に、多くの異なる json 応答に対して 1 つを作成する場合はそうです。
を使ってみました。
JObject
が、どうもうまくいかない。
List<string> lst = new List<string>();
JObject j = JObject.Parse(json_string);
foreach (JProperty p in j.SelectToken("data").Children().Children())
{
lst.Add(p.Name);
}
何か良い方法はないでしょうか?
どのように解決するのですか?
いろいろな方法がありますが、今あるものでいいんです。他のいくつかの選択肢を以下に示します。
- すべての子要素ではなく、配列の最初の要素を取得します。
-
使用方法
SelectToken
を使用すると、1回の呼び出しで配列の最初の要素に移動できます。string json = @"{ ""data"": [ { ""installed"": 1, ""user_likes"": 1, ""user_education_history"": 1, ""friends_education_history"": 1, ""bookmarked"": 1 } ] }"; JObject j = JObject.Parse(json); // Directly traversing the graph var lst = j["data"][0].Select(jp => ((JProperty)jp).Name).ToList(); Console.WriteLine(string.Join("--", lst)); // Using SelectToken lst = j.SelectToken("data[0]").Children<JProperty>().Select(p => p.Name).ToList(); Console.WriteLine(string.Join("--", lst));
関連
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] json.netを使用して、クラス内のプロパティがnullの場合、それを無視する方法
-
[解決済み] Json.netでシリアライズする際、プロパティ名を変更するにはどうすればよいですか?
-
[解決済み] Json.netを使用してJSONオブジェクトを動的オブジェクトにデシリアライズする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】Linq 構文 - 複数列の選択