

VisualStudio2012 C++に [picojson](https://github.com/kazuho/picojson) を組み込んで
json ファイルを読みこませようとしたのですが、json ファイルの階層構造に対応した読み込みが意図した通りできません。  
（一番欲しいデータは、jsonファイルにある"polygonListのarrayにある配列( pointId, X, Y です）

[以前お聞きした質問](https://ja.stackoverflow.com/q/68200)
を参考に読ませようとしたのですが、"field"をarray型で読ませたあと  
中のPointA, PointB,...およびarray型のpolygonListを読ませようとしたのですがうまくいきません。

* * *

**読ませたいjsonファイル**

[code]

    {
        "field": [
            {
                 "PointA": "10",
                 "PointB": "12",
                 "fieldId": "12345",
                 "polygonList": [
                     {
                         "pointId": "0",
                         "X": "36.4",
                         "Y": "137.8"
                     },
                     {
                         "pointId": "1",
                         "X": "36.4",
                         "Y": "137.8"
                     },
                     {
                         "pointId": "2",
                         "X": "36.4",
                         "Y": "137.8"
                     },
                     {
                         "pointId": "3",
                         "X": "36.4",
                         "Y": "137.8"
                     }
                 ]
            }
        ]
    }
    
[/code]

* * *

**試したこと**

作成していたソースコードの部分

[code]

      // ファイルを読み込むための変数
      std::ifstream fs;
    
      // ファイルを読み込む
      fs.open("sample.json", std::ios::binary);
    
      // 読み込みチェック
      // fs変数にデータがなければエラー
      assert(fs);
    
      // Picojsonへ読み込む
      picojson::value val;
      fs >> val;
    
      // fs変数はもう使わないので閉鎖
      fs.close();
    
      // Playerの名前を取得
        picojson::object& obj = val.get<picojson::object>();
        picojson::array& feat = obj["field"].get<picojson::array>();
    
[/code]

で、fieldの範囲をarray型で取得しておいて

[code]

    for (unsigned int i = 0; i < feat.size(); i++) {
    
[/code]

として、複数のfieldに対応した読込をさせてようとしていました。しかし、参考にした回答の通りに  
各arrayをobjectにして変換して各タグの値を読ませる方法をとろうとしたのですが

[code]

    picojson::object& featN = feat[i].get<picojson::object>();
    double hoge = featN["PointA"].get<double>();
    
[/code]

という記述をしてみましたが、エラーがでて通りませんでした。（get()の行の処理でエラーがおきます）  
array型の座標値についても

[code]

    picojson::array& pathD2 = paths["polygonList"].get<picojson::array>();
    for (unsigned int k = 0; k < pathD2.size(); k++) {
            double id = pathD2["pointId"].get<double>();
            double x = pathD2["X"].get<double>();
            double y = pathD2["Y"].get<double>();
    }
    
[/code]

と記述してもエラーが出て取得できませんでした。

以前質問して回答をいただいた処理とほぼ同じ処理なので、動くと思ったのですがどこか異なるのか、うまく動作しない状態です。

何か記述方法に間違いがあるのでしょうか。  
記述方法の間違いなどありましたらご指摘いただけますよう、よろしくお願いいたします。


CC BY-SA 4.0
2020-07-15T09:07:05.597
68610
2020-07-15T12:53:59.340
2020-07-15T12:03:01.537
3060
40898
question
c++ json array データ構造
picojsonで階層構造のjsonファイルを読ませたい


この前と違って`value`部分が`"`で囲まれて文字列となっているので、いったん`std::string`で`get`して`stod`とか`strtod`で変換すれば良いでしょう。  
以下のようになります。

[code]

    for (unsigned int i = 0; i < feat.size(); i++) {
        picojson::object& featN = feat[i].get<picojson::object>();
    
        double pointA = std::stod(featN["PointA"].get<std::string>());
        double pointB = std::stod(featN["PointB"].get<std::string>());
        std::string fieldId = featN["fieldId"].get<std::string>();
        std::cout << "PointA: " << pointA << ",  PointB: " << pointB << ",  fieldId: " << fieldId << std::endl;
    
        picojson::array& pgList = featN["polygonList"].get<picojson::array>();  // 変数名は変更
        for (unsigned int k = 0; k < pgList.size(); k++) {
            
            picojson::object& pg = pgList[k].get<picojson::object>();
            
            double id = std::stod(pg["pointId"].get<std::string>());
            double x = std::stod(pg["X"].get<std::string>());
            double y = std::stod(pg["Y"].get<std::string>());
            std::cout << "    pointId: " << id << ",  X: " << x << ",  Y: " << y << std::endl;
        }
    }
    
[/code]


CC BY-SA 4.0
2020-07-15T12:53:59.340
68615
2020-07-15T12:53:59.340
26370
68610
answer