Как десериализовать ответ c # http в андроид студии с помощью gson - PullRequest
0 голосов
/ 20 сентября 2019

Я перепробовал много вещей, но безрезультатно.Ответ извлекается службой ASP.NET.В ответе есть поле «$ id», которого нет в таблице базы данных.Я считаю, что это всего лишь инструмент индексирования, который C # использует для идентификации полей и ответов.

Вот ответ API

[
  {
    "$id": "1",
    "AccountEvaluations": [],
    "EvaluationDevelopments": [],
    "EvaluationQuestions": [],
    "ID": "44e5ecdb-e7b8-412e-8f09-f8e1ec18eeaf",
    "TestName": "Psychometric Evaluation"
  },
  {
    "$id": "2",
    "AccountEvaluations": [],
    "EvaluationDevelopments": [],
    "EvaluationQuestions": [],
    "ID": "4db4a145-0158-488b-b44d-285ce99111c7",
    "TestName": "Numeric Reasoning Evaluation"
  },
  {
    "$id": "3",
    "AccountEvaluations": [],
    "EvaluationDevelopments": [],
    "EvaluationQuestions": [],
    "ID": "941495b9-7bc6-4451-bd79-86c31617fa5c",
    "TestName": "Comprehesnive Evaluation"
  }
]

Я удалил данные из других таблиц (массивов)чтобы упростить ответ.

Класс объекта, к которому я пытаюсь его проанализировать с помощью gson

package com.example.coregradingmobile.ui.Controllers;

import com.google.gson.annotations.SerializedName;

import java.util.HashSet;

public class Evaluations {

    @SerializedName("$id")
    private String AAA;
    @SerializedName("ID")
    private String ID;
    @SerializedName("TestName")
    private String TestName;
    @SerializedName("AccountEvaluations")
    private HashSet<AccountEvaluations> AccountEvaluations;
    @SerializedName("EvaluationDevelopments")
    private HashSet<EvaluationDevelopments> EvaluationDevelopments;
    @SerializedName("EvaluationQuestions")
    private HashSet<EvaluationQuestions> EvaluationQuestions;

    public Evaluations()
    {
        AccountEvaluations = new HashSet<>();
        EvaluationDevelopments = new HashSet<>();
        EvaluationQuestions = new HashSet<>();
    }


    public String getAAA() {
        return AAA;
    }

    public void setAAA(String AAA) {
        this.AAA = AAA;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getTestName() {
        return TestName;
    }

    public void setTestName(String testName) {
        TestName = testName;
    }

    public HashSet<AccountEvaluations> getAccountEvaluations() {
        return AccountEvaluations;
    }

    public void setAccountEvaluations(HashSet<AccountEvaluations> accountEvaluations) {
        AccountEvaluations = accountEvaluations;
    }

    public HashSet<EvaluationQuestions> getEvaluationQuestions() {
        return EvaluationQuestions;
    }

    public void setEvaluationQuestions(HashSet<EvaluationQuestions> evaluationQuestions) {
        EvaluationQuestions = evaluationQuestions;
    }

    public HashSet<EvaluationDevelopments> getEvaluationDevelopments() {
        return EvaluationDevelopments;
    }

    public void setEvaluationDevelopments(HashSet<EvaluationDevelopments> evaluationDevelopments) {
        EvaluationDevelopments = evaluationDevelopments;
    }
}

Как я вызываю библиотеку JSON для выполнения своей работы (обратите внимание, что запрос являетсяСтрока JSON. Это работает):

Gson gson = new Gson();
Type collectionType = new TypeToken<Collection<Evaluations>>(){}.getType();
Collection<Evaluations> enums = gson.fromJson(request, collectionType);

Ошибка, которую я получаю (Есть еще, но это единственная важная вещь):

android.content.res.Resources$NotFoundException: String resource ID #0x3

Я попытался прогнать вещи вокругв классе, но ничего не работает.Любая помощь будет принята с благодарностью.Спасибо

1 Ответ

0 голосов
/ 20 сентября 2019

Попробуйте добавить аннотацию @Expose, рабочий пример:

app \ src \ main \ assets \ js \ test.json

[
  {
    "$id": "1",
    "AccountEvaluations": [],
    "EvaluationDevelopments": [],
    "EvaluationQuestions": [],
    "ID": "44e5ecdb-e7b8-412e-8f09-f8e1ec18eeaf",
    "TestName": "Psychometric Evaluation"
  },
  {
    "$id": "2",
    "AccountEvaluations": [],
    "EvaluationDevelopments": [],
    "EvaluationQuestions": [],
    "ID": "4db4a145-0158-488b-b44d-285ce99111c7",
    "TestName": "Numeric Reasoning Evaluation"
  },
  {
    "$id": "3",
    "AccountEvaluations": [],
    "EvaluationDevelopments": [],
    "EvaluationQuestions": [],
    "ID": "941495b9-7bc6-4451-bd79-86c31617fa5c",
    "TestName": "Comprehesnive Evaluation"
  }
]

Evaluations.java

import androidx.annotation.NonNull;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Evaluations {

    @Expose
    @SerializedName("$id")
    private String AAA;

    @Expose
    @SerializedName("ID")
    private String ID;

    @Expose
    @SerializedName("TestName")
    private String TestName;

    @NonNull
    @Override
    public String toString() {
        return String.format("%s(", Evaluations.class.getSimpleName()) +
                String.format("AAA=%s, ", AAA) +
                String.format("ID=%s, ", ID) +
                String.format("TestName=%s", TestName) +
                ")";
    }

}

MainActivity.kt например, внутри метода onCreate () - я быстро протестировал его на своем открытом проекте, поэтому это файл KOTLIN!

    val fileName = "js/test.json"
    val fileData = applicationContext.assets.open(fileName).bufferedReader().use{ it.readText() }

    val gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
    val listType = object : TypeToken<Collection<Evaluations>>(){}.type
    val obj = gson.fromJson<Collection<Evaluations>>(fileData, listType)
    Log.v("TAG", "obj: " + obj)

Выход журнала:

obj: [Evaluations(AAA=1, ID=44e5ecdb-e7b8-412e-8f09-f8e1ec18eeaf, TestName=Psychometric Evaluation), Evaluations(AAA=2, ID=4db4a145-0158-488b-b44d-285ce99111c7, TestName=Numeric Reasoning Evaluation), Evaluations(AAA=3, ID=941495b9-7bc6-4451-bd79-86c31617fa5c, TestName=Comprehesnive Evaluation)]
...