none
ネストされたJSONデータの読み出しについて RRS feed

  • 質問

  • 初めて投稿させて頂きます。
    よろしくお願いします。

    以下のようなjsonデータについて、「ハローワールド!」の部分を読み出したいのですが、ネストされているため難儀しております。

    Newtonsoft.Json を使用しています。

    アドバイスをいただけると大変助かります。

    [
      {
        "detectedLanguage": {
          "language": "en",
          "score": 1.0
        },
        "translations": [
          {
            "text": "ハローワールド!",
            "to": "ja"
          }
        ]
      }
    ]

    2018年9月17日 12:15

回答

  • 変換サービスがあるので使ってみてください。

    json2csharp
    http://json2csharp.com/

    質問者さんの書いた JSON 文字列は以下のように変換されます。

    public class DetectedLanguage
    {
        public string language { get; set; }
        public double score { get; set; }
    }
    
    public class Translation
    {
        public string text { get; set; }
        public string to { get; set; }
    }
    
    public class RootObject
    {
        public DetectedLanguage detectedLanguage { get; set; }
        public List<Translation> translations { get; set; }
    }

    一番外側の [ ] は配列を表すので、以下のように List<RootObject> にデシリアライズして、

    string jsonString = "JSON 文字列";
    var result = JsonConvert.DeserializeObject<List<RootObject>>(jsonString);

    result[0].translations[0].text で取得できるはずです。

    2018年9月17日 16:15

すべての返信

  • 変換サービスがあるので使ってみてください。

    json2csharp
    http://json2csharp.com/

    質問者さんの書いた JSON 文字列は以下のように変換されます。

    public class DetectedLanguage
    {
        public string language { get; set; }
        public double score { get; set; }
    }
    
    public class Translation
    {
        public string text { get; set; }
        public string to { get; set; }
    }
    
    public class RootObject
    {
        public DetectedLanguage detectedLanguage { get; set; }
        public List<Translation> translations { get; set; }
    }

    一番外側の [ ] は配列を表すので、以下のように List<RootObject> にデシリアライズして、

    string jsonString = "JSON 文字列";
    var result = JsonConvert.DeserializeObject<List<RootObject>>(jsonString);

    result[0].translations[0].text で取得できるはずです。

    2018年9月17日 16:15
  • 早速のご回答、ありがとうございます。クラスの自動生成サービスまではたどり着いていたのですが、デシリアライズするところで間違っていました。

    var result = JsonConvert.DeserializeObject<List<RootObject>>(jsonString);

    とすべき所、

    var result = JsonConvert.DeserializeObject<RootObject>(jsonString);

    としておりました。 無事に解決出来ました。ありがとうございました。


    2018年9月17日 22:05
  • > クラスの自動生成サービスまではたどり着いていたのですが、デシリアライズするところで間違っていました。

    情報の後出し小出しはここのようなサイトでは NG です。質問する前に知っていたこと・試したことは回答者・閲覧者に提供すべき情報として質問文の中にきちんと書いてください。

    今回の場合は、

    (1) JSON ⇒ C# クラスの変換サービスまではたどり着いていたこと、

    (2) 変換結果を提示すること、

    (3) 変換結果を用いてどのようにデシリアライズしようとしたか、できればそのコードを書く、

    (4) 上記 (3) の結果がどうなったか、エラーメッセージが出ていたらそれを書く

    ・・・です。それらは最初の質問に書けたはず。

    何故 NG かと言うと、

    a) MSDN Forum は技術者同士の情報交換の場として提供されているということで、お互い適切な情報提供を行うのが基本。

    フォーラムでご質問頂くにあたっての注意点
    https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68/12501124571254012521125121239112372360742183938914123671239512?forum=announceja

    b) 上記 (1) ~ (4) の情報が最初の質問に提供されていれば、回答者・閲覧者は DeserializeObject<T>() の T をどうすべきかと言うとことから考え始めればよい。⇒ 回答者・閲覧者が無駄に時間と労力を費やすことがないよう配慮してください。

    c) 情報不足ですと、不足情報を提供してもらうための質問など無駄なやり取りが増えたり、不明なところを想像で回答して想像が間違っていると Q&A が空回りする。

    d) 適切な情報が提供されていれば、タイムリーに的を得た回答が得やすいということで、質問者さんにもメリットがあります。

    初めて投稿ということで不慣れだったかもしれませんが、もし次回質問する機会がありましたら、上記の点によろしく配慮願います。

    2018年9月18日 1:22