例如在PHP中:
<?php
$my_var = 1;
$my_var = [ "1" ]; // no problem
在Java中,我尝试使用混合参数创建一个Class:
class MyClass {
public String my_var;
}
MyClass c = new MyClass();
c.my_var = "ok";
c.my_var = 1; // error during compilation time
我问的原因是因为我正在使用带json的球衣,我试着制作一个反馈类。
我的Feedback类中的一个参数是以Ajax方式发送回前端的数据。有时data
是普通字符串:
`{ "data" : "hello world" }`
有时它可以是一个数组
`{ "data" : [ "hello", "world" ] }` or `{ "data" : [ { "id": 1 }, { "id": 2 }, ... ] }`
对于Java语言和库,我是一个真正的小说。我现在能想到的唯一解决方案是覆盖Json编码中涉及的对象的toString
方法,但是&#34; toString&#34;&#34; List
会给我一些东西那样,
`{ "data" : "[ ...]" }` which is incorrect.
答案 0 :(得分:1)
你可以这样做:
Object c = new Object();
c = new String("hi"); //valid
c = new Integer(1); //valid
然后检查它是什么类型的变量,你可以使用instanceof
您也可以将其设为数组或列表,如果您想在其上使用toString
来打印任何对象,则可以使用重写的toString
方法创建自己的列表类打印得很好,并在对象中使用该类
使用具有漂亮toString
方法的对象意味着如果您只想获取对象的字符串表示,则不必使用instanceof
答案 1 :(得分:1)
Java是一种静态类型的语言;和&#34;动力学&#34;仅限于将子类值分配给超类变量,例如:
Object o = "a string";
o = new Double(42.0);
所以看起来o
可以是String,Integer。但正如所说;这是因为Object是两者这些类的超级类型。
例如:
String s = "meow";
s = 42;
导致编译器错误。例如,再次发挥作用的是s = Integer.toString(42)
。
同样,你可以这样做:
Object o = new int[5];
因为在Java 中任何引用类型(包括数组)都是Object的子类。
准确地说:Java人们认为这是优势。因为它允许在编译时进行更多的检查 - 捕获许多错误,这些错误要求你在那些动态语言中编写/运行单元测试,鸭子可以像猫一样喵喵叫,最后仍然会吠叫。
回到你的问题:从 Java 的角度来看,数组与字符串不同。因此,你不会低这样的JSON表示。换句话说:我首先尝试更改JSON格式。
如果不可能,我会查看自定义 JSON de /序列化代码 - 以便让框架决定给出哪种情况并做适当的事情。同样灵感,你可以看一下gson如何做到这一点。
答案 2 :(得分:0)
目前你还不能用Java做到这一点,所以你必须做一个间接的解决方法,但是有计划在Java版本10中实现无类型的对象/变量(目前在8,几乎被移动)到9)
答案 3 :(得分:0)
以oops的方式思考,
拥有像FeedBackResponse
这样的接口,为每种情况设置不同的实现类,让它们实现FeedBackResponse
。
每个类都有不同的属性。
使用json库序列化对象。
例如,
FeedBackResponse response = getResponse("Some Service");
return jsonLib.serialize(response);
厂
private FeedBackResponse getResponse(String attr){
// based on attr create ur object here.
}