Android 解析一种奇怪的JSON

Android 解析一种奇怪的JSON,android,json,Android,Json,我正在使用Android,我有一个奇怪的问题:如何解析具有以下格式的JSON数据: "2" JSON URL结果仅为该数字,没有任何括号({}或[])。这个阵列是如何形成的?提前感谢。这不是有效的JSON字符串。因此,您无法将其真正解析为JSON。这不是一个数组。从您的问题中不太清楚引号是否包含在JSON中。如果是,则为有效的JSON字符串。如果不是,则为有效的JSON编号。根据具体情况,解析非常简单(使用Android内置的org.jsonparser): 或: 编辑:以满足您的场景: S

我正在使用Android,我有一个奇怪的问题:如何解析具有以下格式的JSON数据:

"2"

JSON URL结果仅为该数字,没有任何括号(
{}
[]
)。这个阵列是如何形成的?提前感谢。

这不是有效的JSON字符串。因此,您无法将其真正解析为JSON。

这不是一个数组。从您的问题中不太清楚引号是否包含在JSON中。如果是,则为有效的JSON字符串。如果不是,则为有效的JSON编号。根据具体情况,解析非常简单(使用Android内置的
org.json
parser):

或:


编辑:以满足您的场景:

String jsonString = (String) new JSONTokener(someStringThatComesFromTheServer).nextValue();
if (jsonString.equals("WRONG_PASS")) {
  // do stuff
}
else if (jsonString.equals("WRONG_USER")) {
  // do stuff
}
else {
  // do stuff, such as:
  int userId = Integer.parseInt(jsonString);
}

编辑2:我实际上与RFC4627的作者道格拉斯·克罗克福德取得了联系。似乎:

从形式上说,没有,但有时是有用的


是的,其他人是对的,它不是RFC有效的JSON。对不起,把人搞糊涂了。然而,似乎大多数解析器都能理解它。

这不是有效的JSON,所以您不能这样解析它

说:

您可以通过将其放入数组中来创建有效的JSON:

["2"]
或在对象中:

{"value":"2"}

首先检索远程URL并确定它是JSON还是text/plain

URL url = new URL("http://www.google.com/humans.txt");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
int status = http.getResponseCode();
String contentType = http.getContentType();
String encoding = http.getContentEncoding() == null ? "utf-8" : http.getContentEncoding();
读出响应正文

InputStream in = new BufferedInputStream(urlConnection.getInputStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new buffer[1024];
while (len = (in.read(buffer)) {
  out.write(buffer, 0, len);
}
String contents = new String(out.toByteArray(), encoding);
根据内容类型标题,您可以决定它是JSON还是纯文本内容。或者,偷看第一个字符,看看它是否是一个大括号

if (contentType == null) {
    // handle bad doc here
} else if (contentType.equals("application/json") || content.startsWith("{")) {
    // parse JSON document here
} else if (content.equals("2")) {
    // handle 2
} else if (content.equals("WRONG_PASS") || content.equals("WRONG_USER")) {
    // handle wrong user/pass
} else {
  // handle this as well
}


你确定是JSON吗?内容类型头中有什么?问题其实并不是这样。我必须以字符串形式读取此结果,但我需要登录,它可以是:“2”或“错误的传递”或“错误的用户”,然后将响应视为文本/普通,并构建if-Then-elseif-else语句。如果字符串确实以大括号开头,则将其解析为JSON。@KO:如何?你能发布一个示例代码吗?好的,我解决了我的问题:简单地说,它不是JSON,只是一个字符串!:)感谢您对大家的帮助:)请参阅JSON文档@。这个Felix是正确的-在任何场景、字符串或数字中,这都是有效的JSON。@Felix:否,JSON数据表示一个对象或一个数组:您也可以在我看不到的地方尝试它,它说顶级元素必须是JSON.org上的对象或数组。jsonlint要么是坏的,要么太像jslint了:提供建议,而不是语法纠正。我必须以字符串形式读取这个结果,但我需要一个登录名,它可以是:“2”或“错误的传递”或“错误的用户”@Felix:RFC 4627说JSON文本只能是一个对象或数组。实际上,问题并不是这样。我必须以字符串形式阅读这个结果,但我需要一个登录名,它可以是:“2”或“错误的传递”或“错误的用户”。您的示例非常清楚,但我不能尝试,因为我已经在JSONObject中获得了URL的结果。我可以把什么作为JSONTokener的参数(而不是来自服务器的字符串)?问题实际上并不是这样。我必须以字符串形式读取此结果,但我需要登录,它可以是:“2”或“错误的传递”或“错误的用户”@PiNuZ:所有这些都是JSON中的有效字符串值,但它本身不是有效的JSON。您可以将其包装在括号中以使其成为有效的JSON,也可以将其解析为不同于JSON的内容。JSONLint与JSLint一样,提供语法建议,而不是验证。我尝试过在Java的
org.json
中解析
“2”
、Chrome的原生json解析器(在控制台中尝试
json.parse(“\'2\”);
))和Firefox的原生json解析器(就像Chrome中的一样)中解析,它可以工作。我将它作为URL中的JSONObject。我只想转换成字符串,但我的应用程序。。。我不明白why@Felix:仅仅因为某些库接受无效的JSON并不能使其有效。阅读规范。好吧,我解决了我的问题:简单地说,它不是JSON,而是一个字符串!:)谢谢你对大家的帮助:)
URL url = new URL("http://www.google.com/humans.txt");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
int status = http.getResponseCode();
String contentType = http.getContentType();
String encoding = http.getContentEncoding() == null ? "utf-8" : http.getContentEncoding();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new buffer[1024];
while (len = (in.read(buffer)) {
  out.write(buffer, 0, len);
}
String contents = new String(out.toByteArray(), encoding);
if (contentType == null) {
    // handle bad doc here
} else if (contentType.equals("application/json") || content.startsWith("{")) {
    // parse JSON document here
} else if (content.equals("2")) {
    // handle 2
} else if (content.equals("WRONG_PASS") || content.equals("WRONG_USER")) {
    // handle wrong user/pass
} else {
  // handle this as well
}