2017-02-01 12 views
1

Nehmen Sie die folgende gültige json:Newtonsoft JSON.NET und Leerzeichen in JSON Key Bug?

{ 
    "universe": { 
     "solar system": "sun" 
    } 
} 

und hier ist der einfache C# -Code:

using Newtonsoft.Json; 
JToken x = JToken.Parse("{\"universe\": {\"solar system\": \"sun\"}}"); 
string s = x.First.First.First.Path; 

An diesem Punkt s = "universe['solar system']"

aber ich "universe.['solar system']" erwartet werde (die Bekanntmachung nach '' "Universum").

Wenn der JSON-Schlüssel kein Leerzeichen hat ("solar_system"), bekomme ich "universe.solar_system", was korrekt ist.

Die Frage ist: Ist das ein Fehler in json.net oder muss ich etwas anderes tun, um Leerzeichen in JSON-Schlüsseln zu unterstützen?

Danke,

PT

+1

Nein, Schlüssel ist das Objekt und Sie können kein Objekt mit Leerzeichen definieren –

+0

AFAIK kein Bug, nur dass Bracket-Notation obligatorisch ist, wenn Sie auf einen Schlüssel mit einem Leerzeichen zugreifen. Kann im Moment keine unterstützende Dokumentation finden, daher nur ein Kommentar. – Equalsk

+0

Nun, alle json-Validatoren validieren gerne jsons mit Leerzeichen in den Schlüsseln, einschließlich Newtonsoft's json.net, das sie mit eckigen Klammern umschließt. Mein Problem ist der fehlende Punkt "." zwischen den Schlüsseln. – pts4

Antwort

2

Dies ist kein Fehler. Der von JToken.Path zurückgegebene Pfad soll in JSONPath syntax sein. Wie in den original JSONPath proposal:

JSONPath Ausdrücke können die Punkt -Notation

$.store.book[0].title

oder die Halterung -Notation

$['store']['book'][0]['title']

verwenden

So universe['solar system'] ist vollkommen gültig, und wenn Sie es SelectToken() bestehen werden Sie den richtigen Wert "sun" zurück:

JToken x = JToken.Parse("{\"universe\": {\"solar system\": \"sun\"}}"); 
string path = x.First.First.First.Path; 

Console.WriteLine(path); // Prints universe['solar system'] 
var val = (string)x.SelectToken(path); 
Console.WriteLine(val);  // Prints "sun" 
Debug.Assert(val == "sun"); // No assert 

Siehe auch Querying JSON with SelectToken and escaped properties.

Wenn Sie dennoch die zusätzliche . im Pfad möchten, können Sie Ihre eigene Erweiterungsmethode JTokenExtensions.ExpandedPath(this JToken token) basierend auf der reference source erstellen.

+0

Vielen Dank für die Hilfe. – pts4

Verwandte Themen