gpt4 book ai didi

java - Android JSON 名称顺序

转载 作者:行者123 更新时间:2023-12-01 12:58:19 25 4
gpt4 key购买 nike

我正在使用以下代码来解析来自站点的信息,并且它可以正常工作,预计最后一个 for 循环中的旧代码会出现问题。 names() 的结果为

["569","570","565","566","567","568","562","563","564"]

这些数字应该按数字顺序排列,但事实并非如此。有什么好的办法可以解决这个问题吗?

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.annotation.SuppressLint;
import android.util.Log;

public class JSON {
private String html;
private String version = "version";
private String pageString = null;
private String urlString = "http://frc-manual.usfirst.org/a/GetAllItems/ManualID=3";

public volatile boolean parsingComplete = true;
public JSON(String page){
this.pageString = page;
}
public String getHTML(){
return html;
}
public String getVersion(){
return version;
}

@SuppressLint("NewApi")
public void readAndParseJSON(String in) {
try {
JSONObject reader = new JSONObject(in);


JSONObject head = reader.getJSONObject("data").getJSONObject("SubChapter").getJSONObject("3").getJSONObject("children").getJSONObject(pageString);
html = head.getString("item_content_text");

if(head.has("children")){
JSONObject children = head.getJSONObject("children");
JSONArray sub1 = new JSONArray(children.names().toString());
for(int i=sub1.length()-1;i>=0;i--){
JSONObject children2 = children.getJSONObject(Integer.toString(sub1.getInt(i)));
html = html + "<h2>" + children2.getString("secdisp")+ " " + children2.getString("item_name") + "</h2>";
html = html + children2.getString("item_content_text");
if(children2.has("children")){
JSONObject children3 = children2.getJSONObject("children");
JSONArray sub2 = new JSONArray(children3.names().toString());
html = html + sub2;
for(int j=sub2.length()-1;j>=0;j--){
JSONObject children4 = children3.getJSONObject((String) sub2.get(j));
html = html + "<h3>" + children4.getString("secdisp")+ " " + children4.getString("item_name") + "</h3>";
html = html + children4.getString("item_content_text");
}
}
}
}

JSONObject main = reader.getJSONObject("data");
version = main.getString("LatestManualUpdate");

parsingComplete = false;



} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public void fetchJSON(){
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
InputStream stream = conn.getInputStream();

String data = convertStreamToString(stream);

readAndParseJSON(data);
stream.close();

} catch (Exception e) {
e.printStackTrace();
}
}
});

thread.start();
}
static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}

}

最佳答案

JSONObject 中键的顺序未定义(请参阅 keys() 的文档)。实际上,这意味着它们可能会根据哈希码进行排序,这显然不是您想要的。如果您需要按特定顺序保留这些项目,您可以:

  • 使用不同的 JSON 解析器。谷歌搜索有很多可用的;我建议“推送解析器”可能是最合适的类型,因为这将保证按照定义的顺序依次为您提供对象中的项目。 json-simple就是这样的一个解析器。在“解码示例”页面中查看示例 5 和 6。或者,请参阅示例 4,了解如何更改用于在对象模型模式下存储 JSON 对象的 Map 类型,并注意 LinkedHashMap 保留值的顺序添加到其中。
  • 使用名称列表之前先对其进行排序
  • 更改 JSON 以使用包含数字的对象数组,而不是使用数字作为键的对象,因为数组(显然)按照它们在原始 JSON 中出现的顺序保存。

关于java - Android JSON 名称顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23717618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com