1

私は過去数日間これをいじっていましたが、誰かが問題の原因を明らかにしてくれることを願っています.

私が作成したこのカスタム オブジェクトがあります。

public class WorldInformation
{
    public string ID { get; set; }
    public string name { get; set; }
}

そして、この JSON データ:

string world = "[{\"id\":\"1016\",\"name\":\"Sea of Sorrows\"}, {\"id\":\"1008\",\"name\":\"Jade Quarry\"},{\"id\":\"1017\",\"name\":\"Tarnished Coast\"},{\"id\":\"1006\",\"name\":\"Sorrow's Furnace\"},{\"id\":\"2014\",\"name\":\"Gunnar's Hold\"}]";

カスタムオブジェクトを逆シリアル化することで、データを正常に保存できます。

List<WorldInformation> worlds = JsonConvert.DeserializeObject<List<WorldInformation>>(world);

しかし...

このようなカスタムオブジェクトを作成すると

public class EventItems
{
    public string World_ID { get; set; }
    public string Map_ID { get; set; }
    public string Event_ID { get; set; }
    public string State { get; set; }        
}

次のような JSON データがあります。

string eventItem = "{\"events\":[{\"world_id\":1011,\"map_id\":50,\"event_id\":\"BAD81BA0-60CF-4F3B-A341-57C426085D48\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":50,\"event_id\":\"330BE72A-5254-4036-ACB6-7AEED05A521C\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"0AC71429-406B-4B16-9F2F-9342097A50AD\",\"state\":\"Preparation\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"C20D9004-DF6A-4217-BF25-7D6B5788A94C\",\"state\":\"Success\"}]}";

逆シリアル化しようとするとエラーが発生する

 List<EventItems> events = JsonConvert.DeserializeObject<List<EventItems>>(eventItem);

私が得るエラーメッセージは次のとおりです。

現在の JSON オブジェクト (例: {"name":"value"}) を型 'System.Collections.Generic.List`1[WebApplication1.EventItems]' に逆シリアル化できません3]) 正しく逆シリアル化します。

このエラーを修正するには、JSON を JSON 配列 ([1,2,3] など) に変更するか、逆シリアル化された型を通常の .NET 型 (整数のようなプリミティブ型ではなく、コレクション型ではない) に変更します。 JSON オブジェクトから逆シリアル化できる配列またはリスト)。JsonObjectAttribute を型に追加して、強制的に JSON オブジェクトから逆シリアル化することもできます。

パス「イベント」、1 行目、位置 10。

4

3 に答える 3

3

最初のケースでは、json はオブジェクトの配列であるため、クラス タイプのリストへの逆シリアル化は成功します。2 番目のケースでは、json がオブジェクトであり、その "events" プロパティがオブジェクトの配列に設定されているため、リストに逆シリアル化できません。

あなたができることは、クラス宣言を変更することです:

public class EventItem
{
    public string World_ID { get; set; }
    public string Map_ID { get; set; }
    public string Event_ID { get; set; }
    public string State { get; set; }        
}

public class EventItems
{
    public EventItem[] Events { get; set; }
}

そしてそれを逆シリアル化します:

EventItems events = JsonConvert.DeserializeObject<EventItems>(eventItem);
于 2013-07-06T17:26:40.353 に答える
3

残念ながら、 のようなルート Json 要素を指定する方法はありませんXmlSerializer

Json.NETを使用して、配列内の各オブジェクトの「ルート」要素でJSON配列を逆シリアル化する方法を参照してください。

public class EventItems
{
    public EventItems()
    {
        Events = new List<EventItem>();
    }

    public List<EventItem> Events { get; set; }
}

public class EventItem
{
    public string World_ID { get; set; }
    public string Map_ID { get; set; }
    public string Event_ID { get; set; }
    public string State { get; set; }        
}

使用法:

string eventItem = "{\"events\":[{\"world_id\":1011,\"map_id\":50,\"event_id\":\"BAD81BA0-60CF-4F3B-A341-57C426085D48\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":50,\"event_id\":\"330BE72A-5254-4036-ACB6-7AEED05A521C\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"0AC71429-406B-4B16-9F2F-9342097A50AD\",\"state\":\"Preparation\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"C20D9004-DF6A-4217-BF25-7D6B5788A94C\",\"state\":\"Success\"}]}";

var items = JsonConvert.DeserializeObject<EventItems>(eventItem);
于 2013-07-06T17:29:12.490 に答える
1

2 番目の JSON 文字列からオブジェクトイベントを削除するだけです。

string eventItem = "[{\"world_id\":1011,\"map_id\":50,\"event_id\":\"BAD81BA0-60CF-4F3B-A341-57C426085D48\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":50,\"event_id\":\"330BE72A-5254-4036-ACB6-7AEED05A521C\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"0AC71429-406B-4B16-9F2F-9342097A50AD\",\"state\":\"Preparation\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"C20D9004-DF6A-4217-BF25-7D6B5788A94C\",\"state\":\"Success\"}]";

JSON 文字列は両方の例で同じではないようです。最初の例では、単純な JSON 配列を使用しています。

[
    {
        "id": "1016",
        "name": "Sea of Sorrows"
    },
    {
        "id": "1008",
        "name": "Jade Quarry"
    },
    {
        "id": "1017",
        "name": "Tarnished Coast"
    },
    {
        "id": "1006",
        "name": "Sorrow's Furnace"
    },
    {
        "id": "2014",
        "name": "Gunnar's Hold"
    }
]

2 番目の例では、配列をオブジェクト ( events )に割り当てています。

{
    "events": 
    [
        {
            "world_id": 1011,
            "map_id": 50,
            "event_id": "BAD81BA0-60CF-4F3B-A341-57C426085D48",
            "state": "Active"
        },
        {
            "world_id": 1011,
            "map_id": 50,
            "event_id": "330BE72A-5254-4036-ACB6-7AEED05A521C",
            "state": "Active"
        },
        {
            "world_id": 1011,
            "map_id": 21,
            "event_id": "0AC71429-406B-4B16-9F2F-9342097A50AD",
            "state": "Preparation"
        },
        {
            "world_id": 1011,
            "map_id": 21,
            "event_id": "C20D9004-DF6A-4217-BF25-7D6B5788A94C",
            "state": "Success"
        }
    ]
}
于 2013-07-06T17:30:23.483 に答える