【问题标题】:How to deserialize c# http response in android studio with gson如何使用 gson 在 android studio 中反序列化 c# http 响应
【发布时间】:2019-09-20 07:58:17
【问题描述】:

我尝试了很多很多东西,但都无济于事。响应由 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

我曾尝试在课堂上到处乱转,但似乎没有任何效果。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: c# android json gson deserialization


    【解决方案1】:

    尝试添加@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)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多