SmartGWT transformResponse单个数据与多个数据

时间:2014-05-06 13:46:24

标签: json jackson datasource smartgwt

我有一个成功运行的SmartGWT 4.0和Spring MVC应用程序。我定义了DataSources,他们调用正确的RESTful Web服务并返回JSON。

我遇到的问题是,如果我将用户的ID传递给我的RESTful Web服务,它就可以运行。单个User对象返回给我:

{data: "username":tholmes,"password":"mypwd",
"other":{"field1":"data1","field1":"data1","field1":"data1"}}

然后我可以使用JSOHelper来获取属性,删除属性和添加新属性。 我相信这就是transformResponse的意图。

现在,如果我得到所有用户的列表,那么从同一个RESTful Web服务中,我得到一个User对象的ArrayList,现在看起来像JSON数据:

[
     {data: "username":tholmes,"password":"mypwd",
        "other":{"field1":"data1","field1":"data1","field1":"data1"}},
     {data: "username":tholmes,"password":"mypwd",
        "other":{"field1":"data1","field1":"data1","field1":"data1"}},
     {data: "username":tholmes,"password":"mypwd",
        "other":{"field1":"data1","field1":"data1","field1":"data1"}},
]

因此,我之前更改JSON的代码正在运行,只有一个项目。 现在当我有多个项目时,代码不起作用。 我需要知道的是,如何最好地解决这个问题。

我认为在某一点上,所有内容都作为一组对象返回到SmartGWT数据源中,但可能情况不再如此。

我可能需要检查行数,如果有多于1行,则迭代所有返回的数据。

如果还有其他更容易,更主流的解决方案,那就太棒了。

谢谢!

2 个答案:

答案 0 :(得分:0)

您的两个JSON都不是有效的JSON。

请在The JSON Validator 上查看。

这是第一个有效的JSON。

{
    "username": "tholmes",
    "password": "mypwd",
    "other": {
        "field1": "data1"
    }
}

这是第二个有效的JSON。

[
    {
        "username": "tholmes",
        "password": "mypwd",
        "other": {
            "field1": "data1"
        }
    },
    {
        "username": "tholmes",
        "password": "mypwd",
        "other": {
            "field1": "data1"
        }
    },
    {
        "username": "tholmes",
        "password": "mypwd",
        "other": {
            "field1": "data1"
        }
    }
]

试试这个示例代码:

StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new FileReader(new File("resources/abc1.txt")));
String line = null;
while ((line = reader.readLine()) != null) {
    builder.append(line);
}
reader.close();

Gson gson = new Gson();
UserDetails[] userDetails = gson.fromJson(builder.toString(), UserDetails[].class);
System.out.println(userDetails.length);

...

class UserDetails {
    public String username;
    public String password;
    public Map<String, String> other;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Map<String, String> getOther() {
        return other;
    }

    public void setOther(Map<String, String> other) {
        this.other = other;
    }

}

注意:文本文件包含第二个JSON字符串,如上所示。

答案 1 :(得分:0)

我希望有一个快速的答案,非常具体地使用JSOHelper和SmartGWT数据源。经过一番思考......我意识到从RESTful webv服务中带回来的Object已经通过一次交互并创建了JSON。

在RESTful Web服务中,您可以拥有一个包含数百条(甚至数千条)记录的ArrayList。要在SmartGWT数据源中迭代所有这些,使用JSOHelper看起来效率不高。

我在想...如何在不影响后端的情况下在后端更改此内容。 在其他电子邮件中,它讨论了构建自定义序列化器/反序列化器以帮助将对象转换为JSON。

然后我从XML Jackson映射器中找到了@JSonProperty。这是我们的项目,其中包含我们的实体和dao。我们之前在后端添加了最新的Jackson 2 Fast Mapper到这个项目。因此,在实体类中,我们可以:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonProperty("sommeOtherId")
private long id;

然后我不需要在SmartGWT数据源中做任何事情,JSON就像我想要的那样完全按照我想要的字段名称。

我希望这有助于其他人。