2011-04-06 2 views
2

Je travaille sur quelque chose qui implique l'utilisation de l'API Bit.ly, et permet à l'utilisateur de sélectionner le format (texte, XML, Json) le texte & XML sont terminés. Ceci est le résultat JSON qui est retourné lorsque vous raccourcissez une URL:Bitly, Json, et C#

{ 
    "status_code": 200, 
    "status_txt": "OK", 
    "data": 
    { 
     "long_url": "http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}", 
     "url": "http:\/\/rlm.cc\/gtYUEd", 
     "hash": "gtYUEd", 
     "global_hash": "evz3Za", 
     "new_hash": 0 
    } 
} 

Et ce code C# fonctionne très bien pour analyser et obtenir l'URL courte:

var serializer2 = new JavaScriptSerializer(); 
var values2 = serializer2.Deserialize<IDictionary<string, object>>(json); 
var results2 = values2["data"] as IDictionary<string, object>; 
var shortUrl2 = results2["url"]; 
expandedUrl = results2["url"].ToString(); 
return results2["url"].ToString(); 

Maintenant, voici le JSON renvoyé lors de l'expansion d'une URL:

{ 
    "status_code": 200, 
    "status_txt": "OK", 
    "data": 
    { 
     "expand": 
     [ 
      { 
      "short_url": "http:\/\/rlm.cc\/gtYUEd", 
      "long_url": "http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}", 
      "user_hash": "gtYUEd", 
      "global_hash": "evz3Za" 
      } 
     ] 
    } 
} 

annonce qui est où commence mon problème, comment puis-je changer mon # courant C pour être en mesure de gérer les deux scénarios, parce que vous pouvez voir leur très différents les uns des autres. Des idées?

Répondre

3

J'utilise habituellement Json.NET à cherrypick valeurs de documents JSON. La syntaxe est très concise. Si vous faites référence à NewtonSoft.Json.dll et utilisationNewtonsoft.Json.Linq, vous pouvez écrire:

var job = JObject.Parse(jsonString); 
if (job["data"]["expand"] == null) 
{ 
    Console.WriteLine((string)job["data"]["url"]); 
} 
else 
{ 
    Console.WriteLine((string)job["data"]["expand"][0]["long_url"]); 
} 

Si jsonString est:

string jsonString = @"{""status_code"": 200, ""status_txt"": ""OK"", ""data"": {""long_url"": ""http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}"", ""url"": ""http:\/\/rlm.cc\/gtYUEd"", ""hash"": ""gtYUEd"", ""global_hash"": ""evz3Za"", ""new_hash"": 0 }}"; 

la routine affichera http://rlm.cc/gtYUEd.

Si jsonString est:

string jsonString = @"{""status_code"": 200, ""status_txt"": ""OK"", ""data"": { ""expand"": [ { ""short_url"": ""http:\/\/rlm.cc\/gtYUEd"", ""long_url"": ""http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}"", ""user_hash"": ""gtYUEd"", ""global_hash"": ""evz3Za"" } ] } }"; 

la routine affiche http://panel.aspnix.com/Default.aspx?pid={Removed}.

+0

Juste ce que je cherchais, merci – PsychoCoder

0

En supposant que le fournisseur est cohérent avec le formulaire qu'il envoie, avez-vous besoin d'un code qui gère les deux? Il devrait être direct pour gérer chacun individuellement.

Si vous ne pouvez pas savoir à l'avance quel format vous récupérerez, vous pouvez effectuer les opérations suivantes:

if (results2.ContainsKey("expand")) 
{ 
    //Second example 
} 
else 
{ 
    //First example 
} 
0

Pas sûr que je suis votre problème. Pourquoi ne testez-vous pas, si vous obtenez un résultat de raccourcissement ou un résultat en expansion? Comme ils sont différents, cela pourrait se faire facilement par simple «si() déclarations:

if (results2.ContainsKey("expand")) { 
    // handle the expand part 
} else { 
    // handle the shorten part 

}