JSONの結果を読み取ろうとしています。
これが私のRootObjectです
public class RootObject
{
public int id { get; set; }
public bool is_default { get; set; }
public string name { get; set; }
public int quantity { get; set; }
public string stock { get; set; }
public string unit_cost { get; set; }
}
これが私のJSON結果です
[{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id": 4592, "is_default": false, "name": "Bundle", "quantity": 5, "stock": "100000.00", "unit_cost": "0"}]
ここに結果を読み取るためのコードがあります
public static RootObject GetItems(string user, string key, Int32 tid, Int32 pid)
{
// Customize URL according to geo location parameters
var url = string.Format(uniqueItemUrl, user, key, tid, pid);
// Syncronious Consumption
var syncClient = new WebClient();
var content = syncClient.DownloadString(url);
return JsonConvert.DeserializeObject<RootObject>(content);
}
しかし、私はこのエラーに問題があります:
現在のJSON配列(例:[1,2,3])を型 'avaris_cash_salepoint.BL.UniqueItemDataRootObject'に逆シリアル化できません。型にはJSONオブジェクト(例:{"name": "value"})が正しく逆シリアル化する必要があるためです。このエラーを修正するには、JSONをJSONオブジェクト(例:{"name": "value"})に変更するか、逆シリアル化された型を配列またはコレクションインターフェイス(ICollection、IList)を実装するListのような型に変更しますJSON配列からデシリアライズされます。 JsonArrayAttributeをタイプに追加して、JSON配列からデシリアライズすることもできます。パス ''、行1、位置1。
この行:return JsonConvert.DeserializeObject(content);
このエラーを修正するにはどうすればよいですか?
あなたが持っている問題は、JSONが入ったときのオブジェクトのリストであり、ルートクラスに直接関連していないことだと思います。
var content
は次のようになります(私は仮定します):
[
{
"id": 3636,
"is_default": true,
"name": "Unit",
"quantity": 1,
"stock": "100000.00",
"unit_cost": "0"
},
{
"id": 4592,
"is_default": false,
"name": "Bundle",
"quantity": 5,
"stock": "100000.00",
"unit_cost": "0"
}
]
注: http://jsonviewer.stack.hu/ を使用してJSONをフォーマットします。
したがって、次のことを試してみると動作します。
public static List<RootObject> GetItems(string user, string key, Int32 tid, Int32 pid)
{
// Customize URL according to geo location parameters
var url = string.Format(uniqueItemUrl, user, key, tid, pid);
// Syncronious Consumption
var syncClient = new WebClient();
var content = syncClient.DownloadString(url);
return JsonConvert.DeserializeObject<List<RootObject>>(content);
}
RootObject
のリストを返したくない場合は、反復する必要があります。
コンソールアプリでこれをテストし、うまくいきました。
それは、取得するjsonが単一のインスタンスではなく、RootObject
クラスの配列であるため、DeserialiseObject<RootObject>
はDeserialiseObject<RootObject[]>
(未テスト)。
次に、RootObject
のコレクションを返すようにメソッドを変更するか、デシリアライズされたオブジェクトでさらに処理を行って単一のインスタンスを返す必要があります。
指定した応答のフォーマットされたバージョンを見ると:
[
{
"id":3636,
"is_default":true,
"name":"Unit",
"quantity":1,
"stock":"100000.00",
"unit_cost":"0"
},
{
"id":4592,
"is_default":false,
"name":"Bundle",
"quantity":5,
"stock":"100000.00",
"unit_cost":"0"
}
]
そこには2つのインスタンスがあります。
これを使用して問題を解決できます。
private async void btn_Go_Click(object sender, RoutedEventArgs e)
{
HttpClient webClient = new HttpClient();
Uri uri = new Uri("http://www.school-link.net/webservice/get_student/?id=" + txtVCode.Text);
HttpResponseMessage response = await webClient.GetAsync(uri);
var jsonString = await response.Content.ReadAsStringAsync();
var _Data = JsonConvert.DeserializeObject <List<Student>>(jsonString);
foreach (Student Student in _Data)
{
tb1.Text = Student.student_name;
}
}
配列があり、それを次のようなオブジェクトに変換します。
データ:[{"id":3636、 "is_default":true、 "name": "Unit"、 "quantity":1、 "stock": "100000.00"、 "unit_cost": "0"}、{"id ":4592、" is_default ":false、" name ":" Bundle "、" quantity ":5、" stock ":" 100000.00 "、" unit_cost ":" 0 "}]
複数のJSONのヒント(配列、属性)を読むには、次のことを行いました。
var jVariable = JsonConvert.DeserializeObject<YourCommentaryClass>(jsonVariableContent);
への変更
var jVariable = JsonConvert.DeserializeObject <List<YourCommentaryClass>>(jsonVariableContent);
Foreachループで使用されるメソッドのすべてのビットを見ることができないためです。 foreachループの例
foreach (jsonDonanimSimple Variable in jVariable)
{
debugOutput(jVariable.Id.ToString());
debugOutput(jVariable.Header.ToString());
debugOutput(jVariable.Content.ToString());
}
また、このループでエラーを受け取り、次のように変更しました。
foreach (jsonDonanimSimple Variable in jVariable)
{
debugOutput(Variable.Id.ToString());
debugOutput(Variable.Header.ToString());
debugOutput(Variable.Content.ToString());
}
これはあなたかもしれません
Jsonオブジェクトを別のオブジェクトで消費しようとする前に、apiがブラウザーのapi/rootobjectを介してraw jsonを返していることを確認してください。
それと同じくらい簡単:)