Java Gson通过对象模型解析文本/纯文本不';不隔离字段,但打印所有

Java Gson通过对象模型解析文本/纯文本不';不隔离字段,但打印所有,java,json,gson,htmlunit,Java,Json,Gson,Htmlunit,我有一个字符串,其中包含json数据,格式为text/plain,由web响应返回。我试图通过谷歌的Gson库从mail键中获取特定值。然而,在谷歌上做了一些例子之后,我仍然无法得到邮件的价值。相反,它返回字符串中包含的所有数据 public class EmailData { public String mail; public String getMail() { return mail; } } 通过链接返回的响应具有ff(text/plain)

我有一个字符串,其中包含
json
数据,格式为
text/plain
,由web响应返回。我试图通过谷歌的Gson库从mail键中获取特定值。然而,在谷歌上做了一些例子之后,我仍然无法得到邮件的价值。相反,它返回字符串中包含的所有数据

public class EmailData {
    public String mail;

    public String getMail() {
        return mail;
    }
}
通过链接返回的响应具有ff(
text/plain
)。这是浏览器和控制台上显示的内容

{
  "search": {
    "entry": [
      {
        "dn": "uid=C12345678,c=ph,ou=pages,o=website.com",
        "attribute": [
          {
            "name": "mail",
            "value": [
              "myemail123@website.com"
            ]
          },
          {
            "name": "employeecountrycode",
            "value": [
              "818"
            ]
          },
          {
            "name": "dept",
            "value": [
              "ABC"
            ]
          }
        ],
        "return": {
          "code": 0,
          "message": "Success",
          "count": 1
        }
      }
    ]
  }
}
我希望能够仅获取
mail
的值,即myemail123@website.com

所以我尝试的是这个

public class Test {

public static void main(String[] args) {
    String linkReturningJsonTextPlain = "http://....";
    try (WebClient webClient = new WebClient();){
        Page page = webClient.getPage(linkReturningJsonTextPlain);
        WebResponse response = page.getWebResponse();
        String jsonString = response.getContentAsString();
        Gson gson = new Gson();
        EmailData emailData = gson.fromJson(jsonString, EmailData.class);
        System.out.println(emailData.getMail());

    } catch (Exception e) {
        e.printStackTrace();
    }
}
我得到了
jsonString
中包含的所有数据,而不是myemail123@website.com

我做错了什么?我遵循所有的例子。打印
response.getContentType()

我现在的最后一个选择是手动拆分json字符串和子字符串(ing)


谢谢。

在json格式中,您无法将EmailData类转换回。json格式应为<代码>{“邮件”:mail@example.com“}

以代码为例:

EmailData类

package gson;

public class EmailData {

    private String mail;

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    @Override
    public String toString() {
        return "EmailData{" +
               "mail='" + mail + '\'' +
               '}';
    }
}
用于显示Gson如何转换的测试类

package gson;

import com.google.gson.Gson;

public class Test {

    public static void main(String[] args) {

        Gson gson = new Gson();

        EmailData emailData = new EmailData();
        emailData.setMail("mail@example.com");

        String toJson = gson.toJson(emailData);

        System.out.println("toJson = " + toJson);

        EmailData fromJson = gson.fromJson(toJson, EmailData.class);
        System.out.println("fromJson = " + fromJson);
    }
}

在本例中,我将EmailData类转换为json并返回。为了解决您的问题,我建议您使用正则表达式还是Json来提取电子邮件,如本文所示,并通过构造函数手动创建EmailData类。

我写这个答案是为了参考那些可能会遇到问题的人,他们可能会从包含
数组
值的一串键中提取记录json响应

给定上面文本格式的json数据,这就是我如何从mail元素中获取值的方法

JsonArray attribute_Array = jsonObject.getAsJsonObject("search").
            getAsJsonArray("entry").get(0).getAsJsonObject().getAsJsonArray("attribute");
String email = "not found";
for (JsonElement e : attribute_Array) {
    String key = e.getAsJsonObject().get("name").toString().replace("\"", "");
    if(key.equals("mail")){
        email = e.getAsJsonObject().get("value").toString();
    }
}
初始值为“未找到””的电子邮件将被json元素mail包含的任何值替换

如您所见,
entry
attribute
都作为参数传递给了
getAsJsonArray()
,因为它们都有值数组

我相信这将帮助其他可能在从Json内的嵌套数组中提取值时感到困惑的人

感谢@Velaniv Jr,您提供的链接起到了帮助