2016-06-20 7 views
0

Suche auf 'Newtonsoft.Json.JsonReaderException: Additional text encountered after finished reading JSON content: {. Path '', ...' findet mindestens 3 SO-Fragen, von denen alle auf ungültige JSON zurückverfolgt wurden.JObject.Parse wirft Fehler auf gültige JSON

Ich habe 3 verschiedene Validatoren anprobiert:

[{"Imported": "This registration imported on: 06/20/2016"},{"ContactInfoUpdated": " Street Address2: Suite 222 to Shipping Address2: "}] 

und alle drei Bericht als gültig. Und doch ist der Laufzeitfehler schleudert die gleiche ‚Zusätzlicher Text angetroffen ...‘:

if (!string.IsNullOrWhiteSpace(UserComments)) 
{ 
    JToken addresses; 
    addresses = JObject.Parse(UserComments).GetValue("CarbonCopy"); //errors here 
    if (!ReferenceEquals(null, addresses)) 
    { 
     //stuff 
    } 
} 

Um festzustellen, dass es keine unbeabsichtigten Zeichen nach dem json schließt, ist hier die sql:

UPDATE dbo.[Order] SET UserComments = '[{"Imported": "This registration imported on: 06/20/2016"},{"ContactInfoUpdated": " Street Address2: Suite 222 to Shipping Address2: "}]' WHERE idOrder =121050 
+2

Ihre JSON * ist * gültig, stellt jedoch ein Array aus zwei Objekten dar, kein einzelnes Objekt. Folglich kann 'JObject.Parse' nicht zum Parsen verwendet werden. Verwenden Sie stattdessen 'JArray.Parse' oder' JToken.Parse'. Sie müssen wahrscheinlich auch andere Anpassungen an Ihrem Code vornehmen. es scheint, als ob Sie ein einzelnes Objekt erwarten, das einen Wert namens "CarbonCopy" enthält, aber Sie haben zwei Objekte und keines hat diese Eigenschaft. Es ist nicht ganz klar aus Ihrer Frage, was Sie hier wirklich machen wollen. –

+0

Nur wirklich versuchen, diesen Fehler zu vermeiden - schätzen Sie die Umleitung. – justSteve

Antwort

0

mit dank an Brians Aufforderung fand ich diesen Beitrag sehr hilfreich sein:

Get Value from JSON using JArray

Meine Json ist etwas ungewöhnlich, da es eine Reihe von verschiedenen Objekten ist. Anstelle einer Reihe von Name/Wert-Paar, wo Namen konstant bleibt, mein 'UserComments' Feldpaare enthält, wo Namen sein kann 'ProfileWasEdited', 'CCRequested ', 'Meinung', und so weiter .

Um diese Art von Struktur aufzunehmen ich gegen den Namen Eigenschaft testen müssen:

var fields = JToken.Parse(UserComments); 
var isCC = ""; 
foreach (JObject content in fields.Children<JObject>()) 
{ 
    foreach (JProperty prop in content.Properties()) 
    { 
     if (prop.Name == "CarbonCopy") 
     isCC = prop.Value.ToString(); 
    } 
} 

ReSharper mich informiert, dass ich Linq-ize die oben:

foreach (JProperty prop in fields.Children<JObject>().SelectMany(content => content.Properties().Where(prop => prop.Name == "CarbonCopy"))) 
{ 
    isCC = prop.Value.ToString(); 
}