0

私は実際に PHP Web サービスからの JSON 要求応答を ac# オブジェクトに解析しようとしています。

json.net を使用していくつかのコード サンプルを見つけたので、Wine クラスからこのコードを作成しました。

public Wine(string json)
    {
        JObject jObject = JObject.Parse(json);
        BottleName = (string)jObject["name"];
        Category = (string)jObject["category"];
        Prize50 = Double.Parse((string)jObject["prize_50"]);
        Prize75 = Double.Parse((string)jObject["prize_75"]);
        Prize150 = Double.Parse((string)jObject["prize_150"]);
        Prize300 = Double.Parse((string)jObject["prize_300"]);
    }

次のような応答が 1 つしかない場合は完全に機能します

"{\"id\":\"2\",\"name\":\"Pinot noir\",\"loc_wine\":\"",\"category\":\"Red\",\"prize_50\":\"12.800000\",\"prize_75\":\"16.500000\",\"prize_150\":\"0.000000\",\"prize_300\":\"0.000000\"} "

しかし、json 応答に別の Json 文字列があると問題が発生し、どうすれば対処できるか知りたいですか?

また、ときどき null フィールドがあるのですが、どうすればそれらを無視できますか?

助けてくれてありがとう!:-)

PS必要に応じて、PHPファイルからデータを送信する方法は次のとおりです。

      $req = "SELECT * 
      FROM  t_wine
      WHERE name= \"Pinot noir\""; // for test purpose


      $res = mysqli_query($connection, $req);
      while($data= mysqli_fetch_assoc($res)) {
          extract ($data);
          echo json_encode($data);

      }
4

2 に答える 2

2

ステートメントから複数の行が返される場合mysqli_fetch、配列に応答を入れずに各行の json 応答をエコーすると、不適切な JSON が返されます。あなたの応答は基本的に次のようになります。

{..some data...}{...some data...}

それでは、JSON の配列構造を利用しましょう。配列のように出力するように PHP コードを変更します

$res = mysqli_query($connection, $req);
echo "[";
while($data= mysqli_fetch_assoc($res)) {
    extract ($data);
    echo json_encode($data);
    echo ",";
}
echo "]";

それはあなたに次のようなものを与えるでしょう:

[{...some data...},{...some data...},]

これは大まかであることを覚えておいてください。終了ブラケットの前にある最後のコンマを削除する必要があります。しかし、これは有効な JSON 配列です。

また、jObject を 1 つのオブジェクトではなく、オブジェクトの配列として処理するように C# を変更する必要があります。

于 2012-04-23T16:29:43.427 に答える
0

の複数のインスタンスの取得を処理しようとしてWineいて、json.net で null 値を無視したい場合は、次のようにすることができます。

var settings = new JsonSerializerSettings{ NullValueHandling = NullValueHandling.Ignore };
                                                                               }
JsonConvert.DeserializeObject<IEnumerable<Wine>>(response.ToString(), settings);
于 2012-04-23T16:31:12.563 に答える