web-dev-qa-db-ja.com

現在のJSON配列をデシリアライズできません(例[1,2,3])

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);

このエラーを修正するにはどうすればよいですか?

12
Djama

あなたが持っている問題は、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のリストを返したくない場合は、反復する必要があります。


コンソールアプリでこれをテストし、うまくいきました。

enter image description here

23
Dayan

それは、取得する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つのインスタンスがあります。

4
Psytronic

これを使用して問題を解決できます。

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;
    }
}
3
user3744755

配列があり、それを次のようなオブジェクトに変換します。

データ:[{"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 "}]

1
BlackTigerX

複数の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());
                    }
0
cihatpala

これはあなたかもしれません

Jsonオブジェクトを別のオブジェクトで消費しようとする前に、apiがブラウザーのapi/rootobjectを介してraw jsonを返していることを確認してください。

それと同じくらい簡単:)

0
Albert Takaruza