web-dev-qa-db-ja.com

タイプ「Newtonsoft.Json.Linq.JObject」のオブジェクトをタイプ「Newtonsoft.Json.Linq.JArray」にキャストできません

Web APIをテストしています。私はこれを持っているデータのモック:

var objs = ((JArray)JsonConvert.DeserializeObject("{ \"PrintId\":10,\"Header\":\"header\",\"TC\":\"tc\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}")).Values<JObject>();

これは私にエラーを与えます:

タイプ「Newtonsoft.Json.Linq.JObject」のオブジェクトをタイプ「Newtonsoft.Json.Linq.JArray」にキャストできません

事はそれが働いていたということです。私は何かを変えたに違いありませんが、私は何を知りません。

私の意図は、このJSONオブジェクトを、次のフィールドを持つPrintという.NETオブジェクトのリストに変換することです。

PrintId
Header
TX
CompnayRef
12
Andrew Simpson

クラスを作成し、それを逆シリアル化します。

public class Print
{
    public int PrintId { get; set; }
    public string Header { get; set; }
    public string TC { get; set; }
    public string CompanyRef { get; set; }
}

Print printObj = JsonConvert.DeserializeObject<Print>(yourJson);
printObj.PrintId = //...
25
Camo

メッセージが示すように、オブジェクトはJObjectなので、JArrayにキャストしないでください。これを試して:

var objs = JsonConvert.DeserializeObject("{ \"PrintId\":10,\"Header\":\"header\",\"TC\":\"tc\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}");

Updateコレクションを取得するにはList<Print>、JSONは配列である必要があります。これを試してください(JSONを配列にして、2番目のオブジェクトを追加しました):

string json = "[{ \"PrintId\":10,\"Header\":\"header\",\"TC\":\"tc\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}"
            + ",{ \"PrintId\":20,\"Header\":\"header2\",\"TC\":\"tc2\",\"CompanyRef\":\"00000000-0000-0000-0000-000000000000\"}]";
var objs = JsonConvert.DeserializeObject<List<Print>>(json);

//The loop is only for testing. Replace it with your code.
foreach(Print p in objs){
    Console.WriteLine("PrintId: " + p.PrintId);
    Console.WriteLine("Header: " + p.Header);
    Console.WriteLine("TC: " + p.TC);
    Console.WriteLine("CompanyRef: " + p.CompanyRef);
    Console.WriteLine("==============================");
}

public class Print
{
    public int PrintId { get; set; }
    public string Header { get; set; }
    public string TC { get; set; }
    public string CompanyRef { get; set; }
}

フィドル です。

7
Racil Hilan

私にとっては、問題の原因となったオブジェクトとして空の文字列を入れていましたが、「{}」に切り替えて問題を修正しました

0
Andrew