首页 > 解决方案 > Android - 使用 java 对象转换 API JSON 结果以设置不同的设计

问题描述

我不擅长使用 API,所以我很难通过实践来学习,对于当前的项目,我使用的是 Watson API,它以 JSON 格式显示结果,如下所示。API 根据用户的文本输入生成结果,生成的结果可能有一个或多个基于句子的“音调”。我把它放在一个文本视图中以显示结果。

谁能告诉我如何为“tone_name”和“score”设置不同的字体颜色?我不确定如何将其拆分为 2 个文本视图,因为 JSON 结果是在结构中生成的。如何分离色调以设置不同的颜色或其他设计,但仍保持相同的结果结构?

这就是我获得 API 结果的方式,它显示了一个音调列表和生成的每个音调的分数:

       ToneAnalysis toneAnalysis = toneAnalyzer.tone(toneOptions).execute().getResult();

        List<ToneScore> documentToneScores = toneAnalysis.getDocumentTone().getTones();

        String detectedTones = "";
        for (ToneScore score : documentToneScores) {
            if (score.getScore() > 0.5f) {
                detectedTones += score.getToneName() + " \n" + score.getScore() + "\n\n";
            }
        }

现在结果看起来像这样,因为它显示在单个文本视图中:

在此处输入图像描述

我想把它改成这样?区分音调和乐谱?

在此处输入图像描述

JSON结果格式:

{
  "document_tone": {
    "tones": [
      {
        "score": 0.6165,
        "tone_id": "sadness",
        "tone_name": "Sadness"
      },
      {
        "score": 0.829888,
        "tone_id": "analytical",
        "tone_name": "Analytical"
      }
    ]
  }

xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Main2Activity">

    <TextView
        android:id="@+id/textmain2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:fontFamily="@font/droid_sans"
        android:text="result"
        android:textColor="#000"
        android:textSize="18sp" />

</LinearLayout>

提前谢谢你。

添加了一个 POJO 类,但我仍然不确定如何将其连接到结果 :(

public class Tones {

    private String tones;
    private Double score;

    public String getTones() {
        return tones;
    }

    public void setTones(String tones) {
        this.tones = tones;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    public Tones(String tones, Double score) {
        this.tones = tones;
        this.score = score;
    }

    public Tones() {
    }
}

标签: javaandroidjson

解决方案


您应该使用一个对象来存储要在屏幕上显示的值。目前你把 all in String detectedTones,但你可以创建一个 POJO 或 Kotlindata class来表示它,例如:

data class DetectedTones(val name: String, val score: Double)

然后在 XML 布局中创建两个TextViews - 一个用于 name,另一个用于 score,并在那里设置值。您也可以使用ToneScore该类,但通常应用程序将获取和显示逻辑分开。如果您想分离逻辑(我认为您的情况不需要它),那么您可以使用映射器(具有静态DetectedTones map(input: ToneScore)方法的新类)将一个类映射到另一个类。

在您的设置中,如果您只是将TextViews 放入 XML 布局中,那么您需要提前知道列表中有多少个值。通常你事先并不知道它,然后在Android我们RecyclerView用来显示列表数据。有关更多信息,请参阅 RecyclerView 教程。例如:简单的 Android RecyclerView 示例

在 RecyclerView 的每一行中,您都会有一个定义该行的 XML。在那里你会有 2 TextViews。在 RecyclerView 适配器中,您将编写一个代码,获取列表中的每个项目并将 thename和 the设置score为 these TextViews


推荐阅读