2017-11-06 2 views
0

、のいずれかの応答は、このようなものです:解析JSONレスポンスは、私が</p> <p>ので、制御することはできませんウェブAPIからのオブジェクトの応答を解析しようとしている

{ 
    "BatchID": 25, 
    "Results": [{ 
     "ItemID": 123, 
     "ResultMessage": "COMPLETED" 
    }, { 
     "ItemID": 456, 
     "ResultMessage": "COMPLETED" 
    }], 
    "COMPLETED_COUNT": 2, 
    "INPROGRESS_COUNT": 0, 
    "FAILED_COUNT": 0 
} 

これは、NewtonSoft Jsonライブラリを使用して解析するのが非常に簡単です。しかし、私もこのが発生しています

{ 
    "3305": "COMPLETE", 
    "7305": "COMPLETE", 
    "COMPLETED_COUNT": 2, 
    "INPROGRESS_COUNT": 0, 
    "FAILED_COUNT": 0 
} 

私が発生する可能性があるどのように多くのintプロパティ見当がつかない。この例では「3305」と「7305」の2つしかありません

私の質問は、その応答のすべての整数を保持できるオブジェクトを作成する方法はありますか?

ありがとうございました。

+3

それを 'Dictionary 'として非直列化する必要がある場合は、1つまたは2つのプロパティを既知の構造に逆シリアル化し、これらのプロパティに応じて残りの特定の構造体を分類し、直列化解除する型 –

+0

[この質問](https://stackoverflow.com/questions/15253875/deserialize-json-with-known-and-unknown-fields)にも、既知のプロパティと不明なプロパティの両方をサポートする方法を示します。 「未知」の集合に含まれる。 –

+0

ここでキーには数字が入っていますが、それでも文字列であることに注意してください。これらの文字列に数値が含まれているという事実は、それらの余分なすべてのプロパティで真であることを知っているかもしれませんが、純粋に文字列として扱います。 –

答えて

0

値&名前を持つすべてのプロパティを保持しています最初のJSONの "Results"サブプロパティはこのコンセプトでは扱いにくいので、プロパティのサブセットを調べる "検出"アルゴリズムを作成するように努力する必要があります。 jsonをデシリアライズするために、異なるタイプのものを選択してください。

例えば、ここでは簡単なように経験則である:

public static ResponseBase Classify(string json) 
{ 
    var response = JsonConvert.DeserializeObject<ResponseBase>(json); 

    if (response.ExtraData.ContainsKey("Results")) 
     return JsonConvert.DeserializeObject<ResponseWithResults>(json); 

    return response; 
} 

public class ResponseBase 
{ 
    [JsonProperty("COMPLETED_COUNT")] 
    public int CompletedCount { get; set; } 

    [JsonProperty("INPROGRESS_COUNT")] 
    public int InProgressCount { get; set; } 

    [JsonProperty("FAILED_COUNT")] 
    public int FailedCount { get; set; } 

    [JsonExtensionData] 
    public Dictionary<string, object> ExtraData { get; } = new Dictionary<string, object>(); 
} 

public class ResponseWithResults : ResponseBase 
{ 
    public int BatchId { get; set; } 
    public List<ResponseResult> Results { get; } = new List<ResponseResult>(); 
} 

public class ResponseResult 
{ 
    public int ItemId { get; set; } 
    public string ResultMessage { get; set; } 
} 

はこれが二回JSONをデシリアライズすることをノートを行います。それを処理/回避するさまざまな方法がありますが、これが有効な方法であるかどうかを判断する必要があります。

+0

それは私が探していたものでした。 – Pipo

1

APIから取得したJSONをJObjectのインスタンスにキャストしてみてください。

public class Response 
{ 
    [JsonProperty("COMPLETED_COUNT")] 
    public int CompletedCount { get; set; } 

    [JsonProperty("INPROGRESS_COUNT")] 
    public int InProgressCount { get; set; } 

    [JsonProperty("FAILED_COUNT")] 
    public int FailedCount { get; set; } 

    [JsonExtensionData] 
    public Dictionary<string, object> ExtraData { get; } = new Dictionary<string, object>(); 
} 

してください:それは、公知の構造+いくつかの未知の構造を模倣型に与えられたJSONをデシリアライズJson.Netを使用して、このタイプを使用するタイプを定義するには

関連する問題