【问题标题】:Expected a string but was BEGIN_OBJECT I have to return string期望一个字符串,但 BEGIN_OBJECT 我必须返回字符串
【发布时间】:2019-11-20 11:16:46
【问题描述】:

 class PrintRequest {
        private String data;
        private String userImageBase64;
        private String organizationImageBase64;
        private String fileBase64;
     //getters and setters
    }

使用 PrintRequest printRequest = gson.fromJson(request.getBody(), PrintRequest.class);

json

{ 
   "data":{ 
      "nazwaDostawcy":"nazwa dostawcy (opis)",
      "nazwa":"Gniazdo przemysłowe, kątowe, 2p+E, 16A, 100...130 V AC, IP 44 ",
      "kod":"val",
      "kodEan":"val",
      "kodWewnrtrzny":"val",
      "cennaNetto":"val"
   },
   "fileBase64":""
}

就像在主题中一样,我明白为什么会出现此错误,但我需要将 data 作为字符串返回。我怎样才能实现我的目标?

感谢您的帮助!

【问题讨论】:

  • 您的 JSON 似乎不完整。

标签: java gson


【解决方案1】:

这是不创建自定义 gson 序列化的最简单方法。只需覆盖 toString() 方法

public class PrintRequest {
     private Value data;
     private String userImageBase64;
     private String organizationImageBase64;
     private String fileBase64;
     //getters and setters
}

public class Value {
    String nazwaDostawcy;

    @Override
    public String toString() {
        return "Value{" +
            "nazwaDostawcy='" + nazwaDostawcy + '\'' +
            ", nazwa='" + nazwa + '\'' +
            ", kod='" + kod + '\'' +
            ", kodEan='" + kodEan + '\'' +
            ", kodWewnrtrzny='" + kodWewnrtrzny + '\'' +
            ", cennaNetto='" + cennaNetto + '\'' +
            ", kategoria='" + kategoria + '\'' +
            ", opis='" + opis + '\'' +
            ", logo1='" + logo1 + '\'' +
            ", logo2='" + logo2 + '\'' +
            '}';
}

String nazwa;
String kod;
String kodEan;
String kodWewnrtrzny;
String cennaNetto;
String kategoria;
String opis;
String logo1;
String logo2;
//getters and setters
}

用法:

PrintRequest printRequest = gson.fromJson(json, PrintRequest.class); System.out.println(printRequest.getData().toString());

更新:

使用自定义 JsonDeserializer 的解决方案

public class CustomJsonDeserializer implements JsonDeserializer<PrintRequest> {

    @Override
    public PrintRequest deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        PrintRequest printRequest = new PrintRequest();
        JsonObject jsonObject = jsonElement.getAsJsonObject();
        String dataStr="";
        JsonObject jsonObjectData = jsonObject.getAsJsonObject("data");
        for (Data data : Data.values()) {
            dataStr+=(data.name() + ":" + jsonObjectData.get(data.name()).getAsString()+",\n");
        }
        printRequest.setData(dataStr);
        return printRequest;
    }
}


public enum Data {
    nazwaDostawcy,
    nazwa
}

public class PrintRequest {
    private String data;
    private String userImageBase64;
    private String organizationImageBase64;
    private String fileBase64;
    //getters and setters

用法:

GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        gsonBuilder.registerTypeAdapter(PrintRequest.class, new CustomJsonDeserializer());
        Gson gson = gsonBuilder.create();
        PrintRequest printRequest = gson.fromJson(json, PrintRequest.class);
        System.out.println(printRequest.getData());

【讨论】:

  • 这个解决方案不被接受它必须是一个字符串:/不是强类型对象
  • 然后检查新的解决方案
【解决方案2】:

您需要实现一个自定义反序列化器,它将任何JsonElement 转换为String

class ElementAsStringJsonDeserializer implements JsonDeserializer<String> {

    @Override
    public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return json.toString();
    }
}

用法:

@JsonAdapter(ElementAsStringJsonDeserializer.class)
private String data;

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多