2017-01-19 8 views
1

私はNewtonsoft.Jsonを使用してjsonを逆シリアル化しています。ここに私のjson文字列があります。jsonオブジェクトを文字列に参照するときのRuntimeBinderExeption

{ 
    "data": { 
     "type": "records", 
     "id": "7", 
     "attributes": { 
      "created": "2017-01-19T08:42:56Z", 
      "updated": "2017-01-19T08:42:56Z", 
      "state": 3, 
      "data": { 
       "Lastname": [ 
        "Gonzales" 
       ], 
       "Firstname": [ 
        "Lacy" 
       ], 
       "Email": [ 
        "[email protected]" 
       ], 
       "Salutation": [ 
        "Mrs." 
       ] 
      } 
     } 
    } 
} 

このように動的変数を作成し、firstnameを文字列sに割り当てると、RuntimebinderExceptionが発生します。

dynamic data = JsonConvert.DeserializeObject(responseString2); 
string s = data.attributes.data.Firstname; 

忘れたことはありますか?あなたのご協力に感謝します

答えて

3

JSON構造で判断すると、Firstnameは実際には1つの項目を持つ配列です。

また、あなたのJSONにはdataという名前のルートオブジェクトが含まれているため、あなたもこれを見逃しているようです(変数名をdataにしたので混乱するかもしれません)。

私は行くだろう。また、

"FirstName": "Lacy", 

:あなたが返されるJSONの制御にいる場合、あなたがより簡単に消費されたものに、それをリファクタリングも、

明らか
dynamic result = JsonConvert.DeserializeObject(responseString2); 
string s = result.data.attributes.data.Firstname[0]; 

rawを使用してデータにアクセスしてdynamicを完全に避けることができます。

var firstName = JObject.Parse(json).SelectToken("data.attributes.data.Firstname[0]").ToString(); 

LINQ to JSON詳細については

0

jsonを変更する方法がある場合は、その中の[]を以下のように削除してください。次に、値にアクセスできます。

"data": { 
    "type": "records", 
    "id": "7", 
    "attributes": { 
     "created": "2017-01-19T08:42:56Z", 
     "updated": "2017-01-19T08:42:56Z", 
     "state": 3, 
     "data": { 
     "Lastname":"Gonzales", 
     "Firstname":"Lacy", 
     "Email":"[email protected]", 
     "Salutation":"Mrs." 
     } 
    } 
    } 
} 

か、@ haim770彼の答えで述べたようなjsonを変更せずにアクセスすることができます。

1

まず、あなたのjsonは間違っているようです。

正しいJSON:

{ 
"data": { 
    "type": "records", 
    "id": "7", 
    "attributes": { 
     "created": "2017-01-19T08:42:56Z", 
     "updated": "2017-01-19T08:42:56Z", 
     "state": 3, 
     "data": { 
      "Lastname": [ 
       "Gonzales" 
      ], 
      "Firstname": [ 
       "Lacy" 
      ], 
      "Email": [ 
       "[email protected]" 
      ], 
      "Salutation": [ 
       "Mrs." 
      ] 
     } 
    } 
} 
} 

姓はList<string>、ないstringです。

List<string> ls = obj.data.attributes.data.Firstname; 

Data2は、としてシリアライズされます。

public class Data2 
    { 
     public List<string> Lastname { get; set; } 
     public List<string> Firstname { get; set; } 
     public List<string> Email { get; set; } 
     public List<string> Salutation { get; set; } 
    } 

もう1つの提案。

私はData2が1つのpersionにしか属していないと思うので、json構造を変更する必要があります。

{ 
"data": { 
    "type": "records", 
    "id": "7", 
    "attributes": { 
     "created": "2017-01-19T08:42:56Z", 
     "updated": "2017-01-19T08:42:56Z", 
     "state": 3, 
     "data": { 
      "Lastname": "Gonzales", 
      "Firstname": "Lacy", 
      "Email": "[email protected]", 
      "Salutation": "Mrs." 

     } 
    } 
} 
} 

そして、それをクラスにデシリアライズする場合。 Data2クラスはこのようになります。

public class Data2 
    { 
     public string Lastname { get; set; } 
     public string Firstname { get; set; } 
     public string Email { get; set; } 
     public string Salutation { get; set; } 
    } 

あなたは現在何をしていますか?

string firstName = obj.data.attributes.data.Firstname; 
関連する問題