2016-03-30 11 views
0

Ich arbeite mit JSON API. Da C# keine Zeichen wie - (minus) oder akzeptiert. (Punkt), ich musste jedes Zeichen durch _ (Unterstrich) ersetzen. Die Ersetzung findet statt, wenn die JSON-Antwort als Zeichenfolge empfangen wird, sodass jeder Attributname, der ein - oder ein. Wird es durch ein _ ersetzt, dann ist jeder Attributname identisch mit den Attributnamen in der Klasse, in die er deserialisiert wird.Smart ersetzen Zeichenfolgen

Um es klarer, hier einige Beispiele:

ich folgende JSON empfangen: { "id": 1, "result": [ { "data": [ { "adm-pass": ""}]} In der Klasse möchte ich in ich dieses Attribut deserialisieren: public String adm_pass {get; set;}

Also ersetze ich das Minus mit ein Unterstrich, damit der NewtonSoft-Parser es entsprechend deserialisieren kann.

Mein Problem ist, dass ich manchmal einige negative ganze Zahlen in meinem JSON bekomme. Also, wenn ich die String-Ersetzung in: {"beta" : -1} mache, erhalte ich eine Parsing-Ausnahme, da die -1 (ganze Zahl hier) zu _1 wird und nicht richtig deserialisiert werden kann und eine Ausnahme auslöst.

Gibt es eine Möglichkeit, die Zeichenfolge intelligent zu ersetzen, damit ich diesen Fehler vermeiden kann? Wenn zum Beispiel - ein Int folgt, wird es nicht ersetzt. Wenn es diesen Weg nicht gibt, gibt es eine Lösung für diese Art von Problemen?

Antwort

4

Newtonsoft ermöglicht es Ihnen, den genauen Namen der JSON Eigenschaft angeben, die sie verwenden, um serialisieren/deserialisieren. So sollten Sie in der Lage sein, diese

[JsonProperty("adm-pass")] 
public String adm_pass { get; set; } 

Auf diese Weise beschränkt zu tun, sind Sie nicht Ihre Eigenschaften genau wie die JSON Eigenschaftsnamen zu nennen. Und in Ihrem Fall müssen Sie keinen String ersetzen.

Hoffe, das hilft.

+0

Das ist ziemlich cool. Ich frage mich, ob Microsoft DataContractJsonSerializer etwas Ähnliches hat. Ich schaute und es hat eine Möglichkeit, den Namen mit [DataMember (Name = "user_id")] zu ändern, aber ich konnte nicht finden, ob ein Punkt (.) Oder ein Strich (-) darin unterstützt werden. – Rhyous

+0

Vielen Dank, das löst das ganze Problem. –

+1

@Rhyous Selbst mit dem DataContractJsonSerializer von Microsoft könnten Sie etwas wie [DataMember (Name = "Benutzer-ID")] oder [DataMember (Name = "Benutzer.id")] machen. Diese werden unterstützt – Ferdin

2

Sie müssen überprüfen, ob Sie den Schlüssel und nicht den Wert ersetzen, vielleicht durch einen regulären Ausdruck wie http://regexr.com/3d471

+0

Wenn ich richtig verstehe, muss ich 'content = content.Replace (" - \ D "," _ ");'. Aber das funktioniert nicht mit 'C#'. –

+0

Sie müssen eine Regex.Replace() verwenden. https://msdn.microsoft.com/en-us/library/xwewhkd1%28v=vs.110%29.aspx – M22an

1

Regex könnte funktionieren, wie wallele suggeriert.

Aber ich würde ein neues Objekt wie folgt erstellen:

  1. Erstellen Sie ein neues Objekt:

    var sharpObj = {}; 
    
  2. Schleife durch die Objekte als Eigenschaften wie hier beschrieben: Iterate through object properties

    for (var property in object) { 
        if (object.hasOwnProperty(property)) { 
         // do stuff 
        } 
    } 
    
  3. In der // tun Zeug Secti on, erstellen Sie eine Eigenschaft auf sharpObj mit den gewünschten String-Ersetzungen und setzen Sie die Eigenschaft auf den gleichen Wert.

    var cleanProperty = cleanPropertyName(property); 
    sharpObj[cleanProperty] = orginalObject[property]; 
    

Anmerkung: Ich nehme an, Sie die cleanPropertyName herausfinden können() -Methode oder ähnliches.

  1. Stringify das Objekt

    var string = JSON.stringify(sharpObj); 
    
+0

Danke, aber zuerst: dieser Ansatz macht den Server viel mehr Verarbeitung, zweitens: Ich habe bereits einen JSON-String, ich nicht Ich möchte einen anderen String erstellen und ihn dann stringieren. Dritter: Es wird mehr Code benötigen, da mein JSON mehr Eigenschaften hat und ich will das nicht. –

0

Sie String können Sie prüfen, ob das nächste Zeichen eine ganze Zahl ist, diese in Ihren Code, wie Sie leicht anpassen können bereits ein Zeichen, als solche finden Sie

int a; 

if(int.TryParse(adm_pass.Substring(adm_pass.IndexOf("-") + 1,1),out a)) 
{ 
    //Code if next character is an int 
} 
else 
{ 
    adm_pass = adm_pass.Replace("-","_"); 
} 

Diese Art von Code durchgeschleift werden kann tun könnten, bis es keine verbleibenden Bindestriche/minusen

012 sind
+0

Ich möchte sie ersetzen, nicht löschen. Wenn ich dich richtig verstanden habe. –

+0

Ja, in den Curlies kannst du dann deinen ersetzen, ich bearbeite das für Klarheit –

Verwandte Themen