2016-08-31 26 views
1

JSONレスポンスを送信するサービスがあります。次のようにコントローラのメソッドはなりますJSONレスポンスを解析できません

string varStr = "{proper JSON here}"; 

public string GetListofResourcesInSubscription(string subscriptionId) 
{ 
    // Uncomment any option below to test. The error persists either way. 
    //return varStr; --- Option 1 
    return JsonConvert.SerializeObject(JObject.Parse(varStr)); // Option 2 
} 

応答を取得する方法は、次のようなものです:上記のコントローラメソッドで選択されたreturn文の

response = outgoingRequest.GetResponse() as HttpWebResponse; 

if (response.StatusCode == HttpStatusCode.OK) 
{ 
    responseStream = response.GetResponseStream(); 

    using (var reader = new StreamReader(responseStream)) 
    { 
     string strResp = reader.ReadToEnd(); 
     JObject joResponse = JObject.Parse(strResp); // throws error 
     JArray objArray = (JArray)joResponse["value"]; 
     // other processing 
    } 
} 

にかかわらず、応答パーサは常に投げていますレスポンスの解析中にエラーが発生しました。

次のように解析行を変更すると、問題は解決しますが、その理由はわかりません。

JObject joResponse = JObject.Parse(JsonConvert.DeserializeObject<string>(strResp)); 

また、ASP.NET Web APIコントローラからJSON応答を送信する正しい方法がわかりたいと思います。モデルを作成するのではなく、直接返すJSON文字列があるので、レスポンスを作成するためのモデルを使用したくありません。

アップデート1: エラーは以下の通りです:

"Error reading JObject from JsonReader. Current JsonReader item is not an object: String. Path '', line 1, position 6546."} System.Exception {Newtonsoft.Json.JsonReaderException} 
+3

エラーは何ですか? – Tim

+0

行1、位置6546はヒントかもしれません。例外を引き起こすjsonを提供するのはどうですか? – Jocke

答えて

1

あなたが戻って文字列に複雑なJSONオブジェクトをデシリアライズすることはできません。

JObject joResponse = JObject.Parse(JsonConvert.DeserializeObject<string>(strResp)) 

あなたはJObject、または代替を使用すると、辞書にデシリアライズすることで、または既知の型にどちらかのより多くの成功を持っているかもしれません:あなたの例では、JSONの文字列に評価されると仮定しているため、機能しません。

var dictionary = JsonConvert.DeserializeObject<<Dictionary<string,object>>(strResp); 
+1

実際、私の例はうまくいきます。そのため、詳細を理解したいのです。あなたの声明を受けて、私は戻り値の型がコントローラの文字列であるため、デシリアライズが正常に機能していると思う傾向があります。 – dknight

0

ここでの問題は、コントローラ機能の戻り値の型です。それは文字列を返すので、正しい結果を得るためには文字列へのシリアル化が必要でした。 JSONを返す正しい方法はJTokenhereのように返すことです。コントローラを次のように変更する必要があります。

public JToken GetListofResourcesInSubscription(string subscriptionId) 
    { 
     return JObject.Parse(varStr); 
    } 
関連する問題