1

json 配列に「3」があるユーザーを選択する必要があります。

{
    "People":[  
    {  
        "id" : "123",
        "firstName" : "Bill",
        "lastName" : "Gates",
        "roleIds" : {
                "int" : ["3", "9", "1"]
            }
    },
    {  
        "id" : "456",
        "firstName" : "Steve",
        "lastName" : "Jobs",
        "roleIds" : {
            "int" : ["3", "1"]
        }
    },
    {  
        "id" : "789",
        "firstName" : "Elon",
        "lastName" : "Musk",
        "roleIds" : {
            "int" : ["3", "7"]
        }
    },
    {
        "id" : "012",
        "firstName" : "Agatha",
        "lastName" : "Christie",
        "roleIds" : {
            "int" : "2"
        }
    }
]}

最終的に、私の結果はイーロン・マスクとスティーブ・ジョブズになるはずです。これは私が使用したコードです(およびその他のバリエーション):

var roleIds = pplFeed["People"]["roleIds"].Children()["int"].Values<string>();


var resAnAssocInfo = pplFeed["People"]
.Where(p => p["roleIds"].Children()["int"].Values<string>().Contains("3"))
.Select(p => new
{
    id = p["id"],
    FName = p["firstName"],
    LName = p["lastName"]
}).ToList();

次のエラーが表示されます。

"Accessed JArray values with invalid key value: "roleIds".  Int32 array index expected"

私はに変わり.Values<string>()ましたが.Values<int>()、まだ運がありません。

私は何を間違っていますか?

4

2 に答える 2

3

あなたはかなり近いです。Whereこれからあなたの句を変更してください:

.Where(p => p["roleIds"].Children()["int"].Values<string>().Contains("3"))

これに:

.Where(p => p["roleIds"]["int"].Children().Contains("3"))

すると、必要な結果が得られます (ただし、実際には、サンプル データにはロール ID が"3"2 人ではなく 3 人のユーザーがいます)。

ただし、このコードがまだ機能しない別の問題が発生する可能性があります。intAgatha Christie の場合、 の値は他の配列のような配列ではなく、単純な文字列であることに気付くでしょう。値が配列になる場合とそうでない場合がある場合は、両方を処理できる where 句が必要です。このようなものが動作するはずです:

.Where(p => p["roleIds"]["int"].Children().Contains(roleId) ||
            p["roleIds"]["int"].ToString() == roleId)

...whereroleIdは、探している ID を含む文字列です。

フィドル: https://dotnetfiddle.net/Zr1b6R

于 2016-03-31T18:36:46.800 に答える