gpt4 book ai didi

android - 如何正确解析 Firestore API JSON?

转载 作者:行者123 更新时间:2023-11-29 23:07:46 25 4
gpt4 key购买 nike

我将 Google Cloud Firestore API 用于一个涉及从服务器数据库简单检索数据的项目。设置好所有内容后,我似乎无法弄清楚如何正确解析返回的 JSON,因为我的所有尝试都没有成功。使用 Firestore 包是不可能的,因为这是一个已定义的项目。

我已经尝试过经典方法,因为 Android Studio 仅通过其 HTTPURLConnection 获取字段部分。这是 JSON 结构:

{
"documents": [
{
"name": "projects/...",
"fields": {
"name": {
"stringValue": "Q1"
},
"myValues": {
"arrayValue": {
"values": [
{
"stringValue": "First"
}
]
}
},
"index": {
"integerValue": "0"
}
},
"createTime": "2019-05-24T10:07:10.864421Z",
"updateTime": "2019-05-28T07:52:34.445600Z"
}
]
}

这是我解析它的尝试:


public ArrayList<Question> parse(String json)
{
ArrayList<Question> list = new ArrayList<Question>();
try {
int indeks=0;
String qName="";
ArrayList<String> answerList= new ArrayList<String>();
JSONObject object = new JSONObject(json);
JSONArray dokumenti = object.getJSONArray("documents");
for (int j = 0; j < dokumenti.length(); j++) {
JSONObject jObject = dokumenti.getJSONObject(j);
if (jObject.has("index")) indeks = jObject.getInt("index");
if (jObject.has("name")) qName= jObject.getString("name");
JSONArray answerArray= jObject.getJSONArray("myValues");
for (int i = 0; i < answerArray.length(); i++) {
try {
String answer= answerArray.getString(i);
answerList.add(answer);
} catch (JSONException e) {
Log.d("OOPS", qName);
}
}
}
list.add(new Question(qName, qName, answerList, answerList.get(indeks), 0));
}
catch(JSONException e)
{
//something
}
return list;
}

Database structure

我希望所有文档都得到解析并添加到 list ArrayList 中,但似乎什么也没发生,而且我在 Logcat 中找不到 TAG。

最佳答案

看起来您在访问其父字段之前尝试获取index

if (jObject.has("index")) indeks = jObject.getInt("index");

在这一行中,您应该在父对象fields 之前获取,否则您将无法访问indexname

编辑

我一直在检查你的代码,你在解析一些错误的地方。让我们一步一步来:

  1. 您正在尝试访问 fields 的子项而不访问它们的父项。按照您的结构的解决方案是这样的:
JSONObject jObject = dokumenti.getJSONObject(j);
JSONObject fields = jObject.getJSONObject("fields");
if (fields.has("index") && fields.getJSONObject("index").has("integerValue")) {
indeks = fields.getJSONObject("index").getInt("integerValue");
}
if (fields.has("name") && fields.getJSONObject("name").has("stringValue")) {
qName = fields.getJSONObject("name").getString("stringValue");
}
  1. 您还尝试访问 myValues 数组,而不考虑对象层次结构。正确的方法应该是这样的:
JSONArray answerArray = fields.getJSONObject("myValues").getJSONObject("arrayValue").getJSONArray("values");
for (int i = 0; i < answerArray.length(); i++) {
try {
String answer = answerArray.getJSONObject(i).getString("stringValue");
answerList.add(answer);
} catch (JSONException e) {
Log.d("OOPS", qName);
}
}

通过这些更改,我能够毫无问题地解析您发布的 Json。您可以在这里找到完整的代码:

public ArrayList<Question> parse(String json)
{
ArrayList<Question> list = new ArrayList<Question>();
try {
int indeks = 0;
String qName = "";
ArrayList<String> answerList = new ArrayList<String>();
JSONObject object = new JSONObject(json);
JSONArray dokumenti = object.getJSONArray("documents");
for (int j = 0; j < dokumenti.length(); j++) {
JSONObject jObject = dokumenti.getJSONObject(j);
JSONObject fields = jObject.getJSONObject("fields");
if (fields.has("index") && fields.getJSONObject("index").has("integerValue")) {
indeks = fields.getJSONObject("index").getInt("integerValue");
}
if (fields.has("name") && fields.getJSONObject("name").has("stringValue")) {
qName = fields.getJSONObject("name").getString("stringValue");
}
JSONArray answerArray = fields.getJSONObject("myValues").getJSONObject("arrayValue").getJSONArray("values");
for (int i = 0; i < answerArray.length(); i++) {
try {
String answer= answerArray.getString(i);
answerList.add(answer);
} catch (JSONException e) {

Log.d("OOPS", qName);
}
}
}
list.add(new Question(qName, qName, answerList, answerList.get(indeks), 0));
}
catch(JSONException e)
{
//something
}
return list;
}

关于android - 如何正确解析 Firestore API JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56357546/

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