Sono bloccato in una situazione impossibile. Ho un JSON dallo spazio esterno (non c'è modo che lo cambieranno). Ecco l'JSONIl modo più efficace per correggere un JSON non valido
{
user:'180111',
title:'I\'m sure "E pluribus unum" means \'Out of Many, One.\' \n\nhttp://en.wikipedia.org/wiki/E_pluribus_unum.\n\n\'',
date:'2007/01/10 19:48:38',
"id":"3322121",
"previd":112211,
"body":"\'You\' can \"read\" more here [url=http:\/\/en.wikipedia.org\/?search=E_pluribus_unum]E pluribus unum[\/url]'s. Cheers \\*/ :\/",
"from":"112221",
"username":"mikethunder",
"creationdate":"2007\/01\/10 14:04:49"
}
"E non è neanche lontanamente un JSON valida", ho detto. E la loro risposta è stata "emmm ma Javascript può leggerlo senza lamentarsi!":
<html>
<script type="text/javascript">
var obj = {"PUT JSON FROM UP THERE HERE"};
document.write(obj.title);
document.write("<br />");
document.write(obj.creationdate + " " + obj.date);
document.write("<br />");
document.write(obj.body);
document.write("<br />");
</script>
<body>
</body>
</html>
Problema
dovrei leggere e analizzare questa stringa tramite NET (4) e si è rotto 3 su 14 libreria menzionata nella sezione C# di Json.org (non ho provato il resto di loro). Per risolvere il problema, ho scritto la seguente funzione per risolvere il problema con virgolette singole e doppie.
public static string JSONBeautify(string InStr){
bool inSingleQuote = false;
bool inDoubleQuote = false;
bool escaped = false;
StringBuilder sb = new StringBuilder(InStr);
sb = sb.Replace("`", "<°)))><"); // replace all instances of "grave accent" to "fish" so we can use that mark later.
// Hopefully there is no "fish" in our JSON
for (int i = 0; i < sb.Length; i++) {
switch (sb[i]) {
case '\\':
if (!escaped)
escaped = true;
else
escaped = false;
break;
case '\'':
if (!inSingleQuote && !inDoubleQuote) {
sb[i] = '"'; // Change opening single quote string markers to double qoute
inSingleQuote = true;
} else if (inSingleQuote && !escaped) {
sb[i] = '"'; // Change closing single quote string markers to double qoute
inSingleQuote = false;
} else if (escaped) {
escaped = false;
}
break;
case '"':
if (!inSingleQuote && !inDoubleQuote) {
inDoubleQuote = true; // This is a opening double quote string marker
} else if (inSingleQuote && !escaped) {
sb[i] = '`'; // Change unescaped double qoute to grave accent
} else if (inDoubleQuote && !escaped) {
inDoubleQuote = false; // This is a closing double quote string marker
} else if (escaped) {
escaped = false;
}
break;
default:
escaped = false;
break;
}
}
return sb.ToString()
.Replace("\\/", "/") // Remove all instances of escaped/(\/) .hopefully no smileys in string
.Replace("`", "\\\"") // Change all "grave accent"s to escaped double quote \"
.Replace("<°)))><", "`") // change all fishes back to "grave accent"
.Replace("\\'","'"); // change all escaped single quotes to just single quote
}
Ora JSONlint lamenta solo di nomi di attributi e posso utilizzare entrambe le librerie Json.NET e simplejson per analizzare sopra JSON.
Domanda
Sono sicuro che il mio codice non è il modo migliore di fissare menzionata JSON. C'è qualche possibilità che il mio codice si rompa? C'è un modo migliore per farlo?
Questo JSON è così sbagliato su così tanti livelli. Tuttavia possiamo aggiustarlo. – Mouser
Sono totalmente d'accordo con te, ma siccome provengono dallo spazio, non parlano la nostra lingua e facendoli capire che è sbagliato è ... beh impossibile. – AaA