2016-09-29 82 views
0

我使用我的web服务的弹簧引导。每种方法都会返回Map<Object, Object>,因为它是一种通用类型,并且方法能够返回任何响应,原型为intUser的复杂自定义对象。我还使用Map<Object, Object>来消除JSON中的反斜杠“\”,而不是使用String。为什么数字会自动翻倍?

但我在客户端(Android应用程序)的变量转换出现问题。

在服务器中,Map中的数字变量会被自动转换为双倍(1.0,2.0,3.0,5.0,...),而它是long

如果我在服务器上将数字转换为字符串,那么在客户端进行投射就是正确的。 1,2,3,5,......

return String.valueOf(u.getId()) 

服务器侧可变:

long id; 

服务器侧方法:

public final static String SUCCESS = "0"; 
public final static String NOT_FOUND = "-1"; 

Map<Object, Object> m = new HashMap<>(); 

@RequestMapping("/getUser") 
Map<Object, Object> getUser(@RequestParam(value = "phoneNumber", defaultValue = "") String phoneNumber, 
     @RequestParam(value = "hash", defaultValue = "") String hash) { 

    m.clear(); 

    User user = userRepository.findByPhoneNumberAndHash(phoneNumber, hash); 
    if (user != null) { 
     m.put(ERROR_JSON, SUCCESS); 
     m.put(VALUE_JSON, user); 
    } else { 
     m.put(ERROR_JSON, NOT_FOUND); 
    } 
    return m; 
} 

JSON:

[{"id":1}] and [{"id":"1"}] 

的Android码。改造

userService.getUser(phoneNumber, hash).enqueue(new Callback<Map<Object, Object>>() { 

    @Override 
    public void onResponse(Call<Map<Object, Object>> call, Response<Map<Object, Object>> response) { 
     Map<Object, Object> m = response.body(); 
    } 
    @Override 
    public void onFailure(Call<Map<Object, Object>> call, Throwable t) { 
     t.printStackTrace(); 
    } 
}); 

enter image description here

+1

请提供示例JSON并指出解析这些值的代码。 – Sufian

+0

@Sufian此代码生成Json。 –

+0

您发布的JSON是由服务器还是您的Android应用生成的?你在哪里有这个问题:在服务器或Android应用程序? – Sufian

回答

1

JSON是JavaScript对象。在JavaScript中,没有多余或浮动或双打。一切都是一个数字,并且它在后台都使用了双精度。所以,当你发送JSON时,除非你告诉它将一个值明确地解释为一个值,否则它必须假定它可以是任何有效的数字 - 它必须假设它是一个双精度值。

+0

如果我在浏览器请求,数字显示没有浮点 –

+0

这意味着什么。 JSON只是双倍,所以解析器必须假设一个数字是双倍数,除非你确定它不是。所以它将它解析为双倍。如果你想要它很长,可以使用prasing方法,让你告诉它每个值的类型是什么。 –

+0

没有小数点并不意味着数字不是浮点数。这仅表示它没有用小数格式化。 1是一个完全有效的浮点数。 –

相关问题