Ich bin in einer unmöglichen Situation stecken. Ich habe ein JSON aus dem Weltraum (es gibt keine Möglichkeit, es zu ändern). Hier ist die JSONDer effizienteste Weg, um einen ungültigen JSON zu beheben
{
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"
}
"Es ist bei weitem nicht eine gültige JSON", sagte ich. Und ihre Antwort war "emmm aber Javascript kann es lesen, ohne beschweren!":
<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>
Problem
soll ich lesen und diese Zeichenfolge über .NET zu analysieren (4) und es brach 3 von 14 im C# -Abschnitt von Json.org erwähnten Bibliothek (habe den Rest von ihnen nicht versucht). Um das Problem zu beheben, schrieb ich folgende Funktion, um das Problem mit einfachen und doppelten Anführungszeichen zu beheben.
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
}
Jetzt JSONlint klagt nur über Attributnamen und ich kann beide JSON.NET und simplejson Bibliotheken über JSON parsen verwenden.
Frage
Ich bin sicher nicht der beste Weg, die oben genannten JSON der Festsetzung mein Code. Gibt es irgendein Szenario, dass mein Code brechen könnte? Gibt es einen besseren Weg, dies zu tun?
Das JSON ist auf so vielen Ebenen so falsch. Aber wir können es reparieren. – Mouser
Ich stimme dir vollkommen zu, aber da sie aus dem Weltraum kommen, sprechen sie nicht unsere Sprache und sie verstehen, dass es falsch ist, ist ... also unmöglich. – AaA