【问题标题】:Json Object Array MappingJson 对象数组映射
【发布时间】:2017-05-18 21:54:33
【问题描述】:

我有一个通过 GSON 映射 json 的 POJO,如下所示:

public class Email {
    private String emailFrom;
    private String[] emailTo;
    private String subject;

    //getters and setters 
}

接下来我将在我的客户端应用程序中创建这样的 JSON 对象:

JSONObject basicParams = new JSONObject();
basicParams.put("emailFrom", "abc@gmail.com ");

String[] emailnew= {"cde@gmail.com ","fgh@gmail.com"};
basicParams.put("emailTo", emailnew);
basicParams.put("subject", "Test GSON");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);// converting the json object toString here seems to be the issue
ResponseEntity<String> response = restTemplate.exchange(testUrl, HttpMethod.POST, entity, String.class);

在我的控制器中,我正在这样做:

Gson gson = new GsonBuilder().create();
Email email = gson.fromJson(json, Email.class);

它正在抛出错误。 当我调试时,我的 JSON 看起来像这样:

"basic" -> " {"templateName":"masterTemplate","subject":"Test GSON","emailFrom":"abc@gmail.com","emailTo":"[Ljava.lang.String;@1dc2c13c"}"

为什么它有对象引用?我怎样才能让它保持实际值?

【问题讨论】:

  • 它抛出了什么错误? “我调用 JSON 的样子”是什么意思?输出是一些调试打印吗?
  • 第二个 sn-p 在哪里连接第三个?你是如何得到 JSON 字符串的? JSONObject 是什么库?
  • 错误:第 1 行中的解析器错误..
  • 我也在编写一个客户端,我正在创建我的 JSON 对象,使用 Rest Template 来调用我的宁静 Web 服务。
  • 你混合了两个不同的库。

标签: java json gson resttemplate


【解决方案1】:

这取决于您使用的库。您似乎在键值对的值中输入了一个数组:

basicParams.put("emailTo", emailnew);

但是您在其他条目中输入了字符串。能否提供图书馆的链接?

【讨论】:

  • 我正在使用 import org.json.JSONObject;图书馆
  • 从您提供的链接中,它说:“值可以是以下任何类型:布尔值、JSONArray、JSONObject、数字、字符串或 JSONObject。”它的类型必须能够转换为这些对象之一。
【解决方案2】:

您的第一个 JSON 库不知道如何处理数组。它只是在上面调用toString()。您需要将数组包装成List 对象:

basicParams.put("emailTo", Arrays.asList(emailnew));

【讨论】:

  • 谢谢.. 会试试的。
【解决方案3】:

我想你的JSONObject 来自JSON in Java。我的试用似乎没有任何问题。这是我的代码:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import org.json.JSONObject;

class Email {
    private String emailFrom;
    private String[] emailTo;
    private String subject;

    public String getEmailFrom() {
        return emailFrom;
    }

    public String[] getEmailTo() {
        return emailTo;
    }

    public String getSubject() {
        return subject;
    }
}

public class Main {

    public static void main(String[] args) {
        JSONObject basicParams = new JSONObject();
        basicParams.put("emailFrom", "abc@gmail.com ");
        String[] emailnew= {"cde@gmail.com ","fgh@gmail.com"};
        basicParams.put("emailTo", emailnew);
        basicParams.put("subject", "Test GSON");

        String json = basicParams.toString();
        System.out.println(json);

        Gson gson = new GsonBuilder().create();
        Email email = gson.fromJson(json, Email.class);
        System.out.println(email.getEmailFrom());
        for (String emailTo : email.getEmailTo()) {
            System.out.println(emailTo);
        }
        System.out.println(email.getSubject());
    }
}

输出是:

{"subject":"Test GSON","emailFrom":"abc@gmail.com ","emailTo":["cde@gmail.com ","fgh@gmail.com"]}
abc@gmail.com 
cde@gmail.com 
fgh@gmail.com
Test GSON

这看起来很正常。我正在使用直接从 maven 中心 herehere 下载的最新版本的库(Java 中的 JSON 和 Gson)。

那么重点是如何在客户端和服务器之间进行通信?与我的简单String json = basicParams.toString();相反,您的沟通可能很复杂。我认为这里有问题,导致解析报告错误。

【讨论】:

  • 我做了同样的测试,似乎工作正常。我想我已经找到了问题,但不知道如何解决它。让我更新我的代码。
猜你喜欢
  • 2019-04-28
  • 2020-07-09
  • 2020-09-28
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多