2012-10-26 4 views
-3

J'essaie de convertir l'extrait de code suivant de PHP en C# ou VB.NET Ceci est à partir d'une page PHP qui est utilisée pour attraper une chaîne JSON depuis un webhook externe .Convertir l'extrait de code de PHP en C# ou VB.NET

// Get the POST body from the Webhook and log it to a file for backup purposes... 
$request_body = file_get_contents('php://input'); 
$myFile = "testfile.txt"; 
$fh = fopen($myFile, 'w') or die("can't open file"); 
fwrite($fh, $request_body); 
fclose($fh); 

// Get the values we're looking for from the webhook 
$arr = json_decode($request_body); 
foreach ($arr as $key => $value) { 
    if ($key == 'properties') { 
     foreach ($value as $k => $v) { 
      foreach ($v as $label => $realval) { 
       if ($label == 'value' && $k == 'zip') { 
        $Zip = $realval;      
       } 
       elseif($label == 'value' && $k == 'firstname') { 
        $Fname = $realval; 
       } 
       elseif($label == 'value' && $k == 'lastname') { 
        $Lname = $realval; 
       } 
       elseif($label == 'value' && $k == 'email') { 
        $Email = $realval; 
       } 
       elseif($label == 'value' && $k == 'phone') { 
        $Phone = $realval; 
        $Phone = str_replace("(", "", $Phone); 
        $Phone = str_replace(")", "", $Phone); 
        $Phone = str_replace("-", "", $Phone); 
        $Phone = str_replace(" ", "", $Phone); 
       } 
       //need the other values as well! 
      } 
     } 
    } 
} 

ETA: J'ai maintenant la chaîne json du flux. J'essaie toujours de comprendre comment analyser cela. Le format de chaîne JSON est hors de mon contrôle, mais j'ai essentiellement besoin du noeud "properties".

+0

juste google "Ouvrir et lire le fichier C#" ... – devHead

+1

Et jusqu'où êtes-vous allé? Publier du code C#/VB.NET que vous avez essayé – Bogdan

+0

n'est pas très loin, car je n'arrive pas à deviner le chemin file_get_contents ('php: // input' '). J'essaie d'utiliser System.Net.WebClient – WhiskerBiscuit

Répondre

2

This answer vous diriger dans la bonne direction sur la façon d'écrire un flux dans un fichier. Le flux dans votre cas étant Request.InputStream qui est l'équivalent de php://input.

Pour gérer la partie JSON, consultez la réponse @ YYY.

+0

Vous pourriez jeter un oeil à # 6 dans ce [meta question] (http://meta.stackexchange.com/a/118694/148672) –

+0

@ConradFrix Merci de me pointer vers ce poste que les lignes directrices sont là très utile. Mais je ne suis pas sûr si # 6 est le cas ici. La réponse que je suis en train de lier est simplement destinée à fournir un point de départ pour le PO et elle ne fournit qu'une partie de la solution à la question posée ici. S'il vous plaît laissez-moi savoir si je ne comprends pas quelque chose. – Bogdan

1

Les bibliothèques de base de .NET n'ont pas de très bons moyens de gérer les entrées JSON. Au lieu de cela, jetez un oeil à Json.NET, qui est une bibliothèque 3ème partie haute performance pour ce besoin.

Il existe des exemples d'utilisation sur la page liée.

1

Voici essentiellement ce que vous essayez de faire si je comprends bien. Mais comme d'autres l'ont mentionné. JSON.NET est la meilleure option.

private void Request() 
{ 
    //Makes Request 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/Test.php"); 
    request.ContentType = "application/json; charset=utf-8"; 
    request.Accept = "application/json, text/javascript, */*"; 
    request.Method = "POST"; 
    using (StreamWriter writer = new StreamWriter(request.GetRequestStream())) 
    { 
     writer.Write("{id : 'test'}"); 
    } 

    //Gets response 
    WebResponse response = request.GetResponse(); 
    Stream stream = response.GetResponseStream(); 
    string json = ""; 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     //Save it to text file 
     using (TextWriter savetofile = new StreamWriter("C:/text.txt")) 
     { 
      while (!reader.EndOfStream) 
      { 
       string line = reader.ReadLine(); 
       savetofile.WriteLine(line); 
       json += line; 
      } 
     } 
    } 

    //Decodes the JSON 
    DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(MyCustomDict)); 
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)); 
    MyCustomDict dict = (MyCustomDict)dcjs.ReadObject(ms); 

    //Do something with values. 
    foreach(var key in dict.dict.Keys) 
    { 
     Console.WriteLine(key); 
     foreach(var value in dict.dict[key]) 
     { 
      Console.WriteLine("\t" + value); 
     } 
    } 

} 
[Serializable] 
public class MyCustomDict : ISerializable 
{ 
    public Dictionary<string, object[]> dict; 
    public MyCustomDict() 
    { 
     dict = new Dictionary<string, object[]>(); 
    } 
    protected MyCustomDict(SerializationInfo info, StreamingContext context) 
    { 
     dict = new Dictionary<string, object[]>(); 
     foreach (var entry in info) 
     { 
      object[] array = entry.Value as object[]; 
      dict.Add(entry.Name, array); 
     } 
    } 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     foreach (string key in dict.Keys) 
     { 
      info.AddValue(key, dict[key]); 
     } 
    } 
} 

crédit this guy

+0

Je suis un peu coincé sur le dictionnaire personnalisé. Votre code se désérialise partiellement, mais les propriétés "internes" du JSON semblent être manquantes. – WhiskerBiscuit

+0

Le JSON provient d'un site externe et il semble avoir des tableaux dans les tableaux. Je ne sais pas comment l'afficher ici, car c'est un gâchis – WhiskerBiscuit

+0

Malheureusement, je n'ai pas la bonne configuration sans votre code direct pour voir ce JSON. Mais je pense qu'il faudrait modifier MyCustomDict pour rechercher des tableaux incorporés dans la boucle foreach. – Corylulu

0

Puisque vous voyous sans cœur me sonné, je me sens obligé d'au moins documenter mes progrès.

Using inputStream As New StreamReader(Request.InputStream) 
     JSON = inputStream.ReadToEnd 
     If JSON.Length > 0 Then 
      Using writer As StreamWriter = New StreamWriter("c:\temp\out.txt") 
       writer.Write(JSON) 
      End Using 
     End If 
    End Using