Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用int和string创建GSON转换器_Android_Json_Gson_Retrofit - Fatal编程技术网

Android 如何使用int和string创建GSON转换器

Android 如何使用int和string创建GSON转换器,android,json,gson,retrofit,Android,Json,Gson,Retrofit,您好,我面临一个问题,创建一个GSON转换器来改装2 在值部分的Api上,我得到了两个可能的参数,int和String 正如你所知道的,有时我下载一个Stringexcept of int时,会出现如下错误: java.lang.NumberFormatException:无效的double:JACK 我正试图创建一个GSON转换器来防止JSON出现这个错误,但我没有意识到 我尝试使用以下方法进行此操作: public class StringTypeAdapter extends TypeAd

您好,我面临一个问题,创建一个GSON转换器来改装2

在值部分的Api上,我得到了两个可能的参数,int和String

正如你所知道的,有时我下载一个Stringexcept of int时,会出现如下错误:

java.lang.NumberFormatException:无效的double:JACK

我正试图创建一个GSON转换器来防止JSON出现这个错误,但我没有意识到

我尝试使用以下方法进行此操作:

public class StringTypeAdapter extends TypeAdapter<String> {


@Override
public void write(JsonWriter out, String value) throws IOException {
    if (Objects.equals(value, "ACE")) {
        value= String.valueOf(1);
        return;
    }
    out.value(value);
}

@Override
public String read(JsonReader in) throws IOException {
    if(in.peek() == JsonToken.NULL){
        in.nextNull();
        return null;
    }
    String stringValue = in.nextString();
    try{
        return String.valueOf(stringValue);
    }catch(NumberFormatException e){
        return null;
    }
}
有人能帮我吗

这是我的班级卡:

public class Card {

    private String image;
    private int value;
    private String suit;
    private String code;
}
下面是JSON的示例

{
"success": true,
"cards": [
    {
        "image": "https://deckofcardsapi.com/static/img/KH.png",
        "value": "KING",
        "suit": "HEARTS",
        "code": "KH"
    },
    {
        "image": "https://deckofcardsapi.com/static/img/8C.png",
        "value": "8",
        "suit": "CLUBS",
        "code": "8C"
    }
],
"deck_id":"3p40paa87x90",
"remaining": 50
}

我在这里宣布这个班级:

  Gson gson = new GsonBuilder().registerTypeAdapter(String.class, new StringTypeAdapter()).create();
        retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

一个国王和一个两个国王冲突,不是吗?无论如何您似乎不需要自定义适配器:您只需要正确的映射。首先,定义类型适配器时,必须注意覆盖所有类型用法。因此,定义字符串类型适配器时,它会影响所有字符串。其次,当您拥有有限数量的元素(如卡片套装和卡片等级)时,可以使用枚举:

枚举诉讼{ @用黑桃代替黑桃, @我的心, @钻石,钻石, @夜总会 } 枚举秩{ @我的名字是王牌, @国王, @女王, @杰克,杰克, @第十名, @第9页第9页, @第八章第八节, @7月7日, @第六名,第六名, @第五名,第五名, @第四名,第四名, @第三名,第三名, @第二名 } 因此,您的其余映射可以按如下方式实现:

期末班卡{ @SerializedNameimage最终URL图像=null; @SerializedNamevalue最终排名=null; @SerializedNamesuit final Suit=null; @SerializedNamecode最终字符串代码=null; } 请注意,所有字段现在都是强类型的。您还可以使Rank返回所需的代码,只需将特定的代码字段添加到枚举中,并通过枚举构造函数对其进行初始化。如果出于某种原因需要一个int字段,最好使用@JsonAdapter注释该字段,使其更加具体:

期末班卡{ @SerializedNameimage最终URL图像=null; @SerializedNamevalue@jsonadapteranktypeadapter.class final int rank=Integet.valueOf0; @SerializedNamesuit final Suit=null; @SerializedNamecode最终字符串代码=null; }
您已注册此TypeAdapter吗?请检查编辑的问题只需更改rivate静态最终列表排名的列表=asListACE、2、3、4、5、6、7、8、9、10、JACK、QUEEN、KING;我想你知道为什么了:祝你今天愉快:D@Rodriquez,这取决于各种游戏,但我认为,根据特定游戏的规则,可以很容易地根据需要更改王牌的最低牌位。请随意编辑我的答案,因为我现在不在我的桌面上。谢谢你保持敏锐的目光
  Gson gson = new GsonBuilder().registerTypeAdapter(String.class, new StringTypeAdapter()).create();
        retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
import static java.util.Arrays.asList;

final class RankTypeAdapter
        extends TypeAdapter<Integer> {

    private static final List<String> ranks = asList("ACE", "2", "3", "4", "5", "6", "7", "8", "9", "10", "JACK", "QUEEN", "KING");

    private RankTypeAdapter() {
    }

    @Override
    public void write(final JsonWriter out, final Integer value) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Integer read(final JsonReader in)
            throws IOException {
        final String rank = in.nextString();
        final int index = ranks.indexOf(rank);
        if ( index == -1 ) {
            throw new MalformedJsonException("Cannot parse: " + rank + " at " + in);
        }
        return index + 1;
    }

}