嗨,我有一个 php 脚本,它将用户数据输入到 mysql 中,从 mysql 中我得到一个数组中的结果,最后通过 PHP 的 json_encode 函数得到 json 格式。下面提供了该文件的内容。
[{"priority":"1","rule_body":"person(?x),pid(?y),haspid(?x,?y)","cons":"patient(?x)","boolean":"1"},
{"priority":"1","rule_body":"patient(?x),hasbp(high)","cons":"situation(emergency)","boolean":"1"},
{"priority":"1","rule_body":"patient(?x),hasbp(high)","cons":"situation(emergency)","boolean":"1"},
{"priority":"1","rule_body":"patient(?x),hasbp(high)","cons":"situation(emergency)","boolean":"1"},
{"priority":"1","rule_body":"aaa(bbb)","cons":"z(x)","boolean":"1"},
{"priority":"1","rule_body":"aaa(bbb)","cons":"z(x)","boolean":"1"},
{"priority":"1","rule_body":"aaa(bbb)","cons":"z(x)","boolean":"1"}]
但是现在我需要在 JAVA 中读取 json,为了方便起见,我将 json 文件的内容复制并粘贴到字符串中。我能够阅读内容,但位置已更改为以下顺序
这是输出
LENGTH IS____7
{"priority":"1","boolean":"1","rule_body":"person(?x),pid(?y),haspid(?x,?y)","cons":"patient(?x)"}
{"priority":"1","boolean":"1","rule_body":"patient(?x),hasbp(high)","cons":"situation(emergency)"}
{"priority":"1","boolean":"1","rule_body":"patient(?x),hasbp(high)","cons":"situation(emergency)"}
{"priority":"1","boolean":"1","rule_body":"patient(?x),hasbp(high)","cons":"situation(emergency)"}
{"priority":"1","boolean":"1","rule_body":"aaa(bbb)","cons":"z(x)"}
{"priority":"1","boolean":"1","rule_body":"aaa(bbb)","cons":"z(x)"}
{"priority":"1","boolean":"1","rule_body":"aaa(bbb)","cons":"z(x)"}
正如您所看到的, boolean 值必须位于最后,但它会弹出在第二个数字上。我尝试了与教程不同的代码,并做了一些自己的代码,如下所示,但结果是相同的:在这件事上需要帮助。
jsonInput=[....as shown above the json contents....]
JSONArray ja = new JSONArray(jsonInput);
System.out.println("LENGTH IS____"+ja.length());
for(int x=0;x<ja.length();x++)
{
JSONObject jb = ja.getJSONObject(x);
System.out.println(jb);
}
System.out.println("KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK");
最佳答案
JSON 未指定键的顺序 As Adrian Smith said :
JSON libraries are free to rearrange the order of the elements as they see fit. This is not a bug.
您可能使用 org.json。您可以使用 getString("myKey")
访问 JSONObject 中的值,而无需知道其位置。
另一种解决方案是创建一个代表您的数据的类:
public class myClass{
private int priority;
private String rule_body;
private String cons;
private String boolean; //STRING ! 1 is not a valid boolean value.
}
然后创建您的类的 ArrayList 并使用 Gson 反序列化其中的 JSON。
Gson myGsonTool = new Gson();
ArrayList<myClass> myData = gson.fromJson(myJsonString, ArrayList<myClass>.class);
然后,您就有了一个包含所有数据的 POJO。您现在可以轻松访问您的数据:
//If i want the value of rule body:
myData.get(0).getRule_Body();
我不知道你的程序的目的,所以这可能不是最好的解决方案。
编辑:Gson 维护记录的顺序。
关于java - 如何正确选择json结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38522522/