3

次のjsonファイルがあります

{"fields":[
  {
     "status":"active",
     "external_id":"title",
     "config":{},
     "field_id":11848871,
     "label":"Title",
     "values":[
        {
           "value":"Test Deliverable"
        }
     ],
     "type":"text"
  },{
     "status":"active",
     "external_id":"client-name",
     "config":{},
     "field_id":12144855,
     "label":"Client Name",
     "values":[
        {
           "value":"Chcuk Norris"
        }
     ],
     "type":"text"
  }}

そして、external_id = "title" を持つフィールドの値を選択したいと思います。たとえば、Json.Net を使用していて、既にオブジェクトを解析しています。Jsonオブジェクトでラムダまたはlinqを使用してこれを行うにはどうすればよいですか

JObject o = JObject.Parse(json);
Title = o["fields"].Select(q => q["extenral_id"].Values[0] == "title");

構文の点でイベントが正しくありません。私は Lambda や Linq にあまり精通していません。助けに感謝します

ありがとう

イェヒア

4

3 に答える 3

6

または、これを行うことができます:

 string json = "{\"fields\":[{\"status\":\"active\",\"external_id\":\"title\",\"config\":{},\"field_id\":11848871,\"label\":\"Title\",\"values\":[{\"value\":\"Test Deliverable\"}],\"type\":\"text\"},{\"status\":\"active\",\"external_id\":\"client-name\",\"config\":{},\"field_id\":12144855,\"label\":\"Client Name\",\"values\":[{\"value\":\"Chcuk Norris\"}],\"type\":\"text\"}]}";

 JObject obj = JObject.Parse(json);

 JArray arr = (JArray)obj["fields"];

 var externalIds = arr.Children().Select(m=>m["external_id"].Value<string>());

externalIds は文字列の IEnumerable 配列です

または、連結してオブジェクトを 1 行で選択することもできます。

var myVal = JObject.Parse(json)["fields"].Children()
                                        .Where(w => w["external_id"].ToString() == "title")
                                        .First();

そこから、任意のセレクターを追加できます。つまり、external_id 値が必要な場合は、["external_id"].ToString() を first() セレクターの末尾に追加します。

于 2012-06-30T10:02:56.573 に答える
1

JSON をオブジェクトに変換した場合 (基本的に Marc が提案したもの)、LINQ クエリは次のようになります。

o.fields.Single(q => q.external_id == "title")

しかし、それをしたくない場合は、文字列キーで値にアクセスする必要があります。値の型を変換したくない場合は、単純にインデックス ( ["key"]) を使用できます。ただし、型を変換したい場合は、を使用できますValue<Type>("key")。まとめると、クエリ全体は次のようになります。

o["fields"].Single(q => q.Value<string>("external_id") == "title")
于 2012-06-30T11:21:35.180 に答える
1

最初にオブジェクトのクラスを構築してから、それらを解析して、正しくアクセスできるようにし、匿名型ではなくなります。

たとえば、このクラス:

class MyJson {
    public List<MyField> fields {get;set;}
}

class MyField {
    public string status {get;set;}
    public string external_id {get;set;}
    // and so on
}

次に、そのクラスを使用して、次のように json を解析します (現在、正確な構文はわかりません)。

var o = Json.Parse(json, typeof(MyJson));

次に、Linq を使用して簡単にデータを選択し、VS (または同様の開発環境) でインテリセンスを使用できます。

var myData = o.fields.Where(q=>q.external_id=="title");
于 2012-06-30T10:01:07.450 に答える