Java小程序不能解析JSON [英] Java Applet cannot parse Json
问题描述
我发展Django的web服务器,并在网页,我嵌入Java小程序。
我要传递给该applet在实例化的时刻一个JSON阵列。完全没有问题,我已经没有任何错误或问题,测试它在Eclipse。
大问题就出来了,当我把这个网页上。
首先,我试着用杰克逊,这里是页面上的code:
<小程序名称=mapGenerator
ID =mapGenerator
code =main.MapGenerator.class
归档={{STATIC_URL}} JAR / MapGenerator.jar,
{{STATIC_URL}} JAR / plugin.jar
{{STATIC_URL}} JAR /杰克逊注释-2.1.1.jar,
{{STATIC_URL}} JAR /杰克逊核心-2.1.1.jar,
{{STATIC_URL}} JAR /杰克逊数据绑定-2.1.1.jar
>
<值参数名称= ID ={{building.id}}>
< PARAM NAME =皮安尼值='{{地板}}'>
MAYSCRIPT
< /小程序>
在Java code解析的JSON:
公共静电地板[]解析(字符串输入,网址codeBase类){ ObjectMapper映射器=新ObjectMapper(); //可以重用,全球共享
BaseFloor [] bfloors = NULL; 尝试{
bfloors = mapper.readValue(输入,BaseFloor []类);
}赶上(JsonParseException E){
// TODO自动生成catch块
e.printStackTrace();
}赶上(JsonMappingException E){
// TODO自动生成catch块
e.printStackTrace();
}赶上(IOException异常五){
// TODO自动生成catch块
e.printStackTrace();
}
的for(int i = 0; I< bfloors.length;我++){ 楼F =新楼(bfloors [I]);
f.set codeBase的(codeBase类);
地板[I] = F;
}
返回地面;
}
在这里,这是我在Java控制台中看到,当我尝试在网页中使用它的错误:
异常螺纹线程applet的main.MapGenerator.class-1java.lang.NoClassDefFoundError的:COM / fasterxml /杰克逊/注释/ JsonAutoDetect
在com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>(VisibilityChecker.java:172)
在com.fasterxml.jackson.databind.ObjectMapper&LT; clinit&GT;(ObjectMapper.java:195)
在objects.Floor.parse(Floor.java:37)
在main.MapGenerator.loadParameters(MapGenerator.java:67)
在main.MapGenerator.start(MapGenerator.java:31)
在sun.plugin2.applet.Plugin2Manager $ AppletExecutionRunnable.run(Plugin2Manager.java:1698)
在java.lang.Thread.run(Thread.java:662)
抛出java.lang.ClassNotFoundException:引起com.fasterxml.jackson.annotation.JsonAutoDetect
在sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:252)
在sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:250)
在sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:180)
在sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:161)
在java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 7个
所以我因子评分一些奇怪的实现问题,我试着用谷歌GSON
由于之前这里是网页code:
&LT;小程序名称=mapGenerator
ID =mapGenerator
code =main.MapGenerator.class
归档={{STATIC_URL}} JAR / MapGenerator.jar,
{{STATIC_URL}} JAR / GSON-2.2.2.jar,
{{STATIC_URL}} JAR / plugin.jar
&GT;
&LT;值参数名称= ID ={{building.id}}&GT;
&LT; PARAM NAME =皮安尼值='{{地板}}'&GT;
MAYSCRIPT
&LT; /小程序&GT;
和Java code:
公共静电地板[]解析(字符串输入,网址codeBase类){ GSON GSON =新GSON(); BaseFloor [] = bfloors gson.fromJson(输入,BaseFloor []类); 楼[] =层楼的新[bfloors.length] 的for(int i = 0; I&LT; bfloors.length;我++){ 楼F =新楼(bfloors [I]);
f.set codeBase的(codeBase类);
地板[I] = F;
}
返回地面;
}
我没有得到任何错误上运行Eclipse中的小应用程序,但是当我去一个网页上的测试...我得到另一个错误:
java.security.AccessControlException:访问被拒绝(java.lang.reflect.ReflectPermission SUP pressAccessChecks)
在java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
在java.security.AccessController.checkPermission(AccessController.java:546)
在java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
在java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:107)
在com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:84)
在com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:66)
在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:71)
在com.google.gson.Gson.getAdapter(Gson.java:353)
在com.google.gson.internal.bind.ArrayTypeAdapter $ 1,创建(ArrayTypeAdapter.java:48)
在com.google.gson.Gson.getAdapter(Gson.java:353)
在com.google.gson.Gson.fromJson(Gson.java:794)
在com.google.gson.Gson.fromJson(Gson.java:761)
在com.google.gson.Gson.fromJson(Gson.java:710)
在com.google.gson.Gson.fromJson(Gson.java:682)
在objects.Floor.parse(Floor.java:33)
在main.MapGenerator.loadParameters(MapGenerator.java:67)
在main.MapGenerator.start(MapGenerator.java:31)
在sun.plugin2.applet.Plugin2Manager $ AppletExecutionRunnable.run(Plugin2Manager.java:1698)
在java.lang.Thread.run(Thread.java:662)
Eccezione:java.security.AccessControlException:访问被拒绝(java.lang.reflect.ReflectPermission SUP pressAccessChecks)
下面是类的 BaseFloor 说我tryng解析,它在同一个包静态函数的:
包对象;
公共类BaseFloor { 公众诠释numero_di_piano;
公共字符串的链接;
公共字符串轴承; 公众持股量getBearing(){
返回Float.parseFloat(轴承);
} 公众诠释getFloor(){
返回numero_di_piano;
} 公共字符串getLink(){
返回的链接;
} 公共字符串的toString(){
返回numero_di_piano ++轴承++链接;
}
}
这是我在传递给applet的JSON:
[{轴承:354.00,链接:/media/floors/Foto_del_63333991-02-2455618_alle_17_35_6.jpg,numero_di_piano:0},{轴承:354.00,链接:/media/floors/IMG_20111009_171138_7.jpg,numero_di_piano:1}]
我很好奇:到底是我执行code的一个问题,或者是它的安全性问题,因为我的小程序没有签名的反射,不能使用
如果你需要的东西,随意问了。
感谢您提前。
修改
我试过你建议@Nikita,而错误改变了!
java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission accessDeclaredMembers)
在java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
在java.security.AccessController.checkPermission(AccessController.java:546)
在java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
在java.lang.SecurityManager.checkMemberAccess(SecurityManager.java:1662)
在java.lang.Class.checkMemberAccess(Class.java:2157)
在java.lang.Class.getDeclaredMethods(Class.java:1790)
在com.fasterxml.jackson.databind.introspect.AnnotatedClass._addMemberMethods(AnnotatedClass.java:593)
在com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveMemberMethods(AnnotatedClass.java:421)
在com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:243)
在com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropertiesCollector.java:442)
在com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collect(POJOPropertiesCollector.java:232)
在com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:142)
在com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:81)
在com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:11)
在com.fasterxml.jackson.databind.DeserializationConfig.introspect(DeserializationConfig.java:507)
在com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:326)
在com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
在com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
在com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
在com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:342)
在com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:2898)
在com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2792)
在com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
在objects.Floor.parse(Floor.java:40)
在main.MapGenerator.loadParameters(MapGenerator.java:67)
在main.MapGenerator.start(MapGenerator.java:31)
在sun.plugin2.applet.Plugin2Manager $ AppletExecutionRunnable.run(Plugin2Manager.java:1698)
在java.lang.Thread.run(Thread.java:662)
Eccezione:java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission accessDeclaredMembers)
解决方案
尝试后插入逗号{{STATIC_URL}} JAR / plugin.jar
在你的页面
的NoClassDefFoundError
。结果这里有一个类似的问题: WEBAPP NoClassDefFound JsonAutoDetect 和失踪
杰克逊注释
引起的问题。I'm developing a web server in Django, and in a page, I embed a Java Applet.
I have to pass to this applet a JSon array at the moment of instantiation. NO problems at all, I've tested it in Eclipse with no errors or problems.
The big problems came out when I put this on the web page.
First I tried with Jackson, here is the code on the page:
<applet name="mapGenerator"
id="mapGenerator"
code="main.MapGenerator.class"
archive="{{STATIC_URL}}jar/MapGenerator.jar,
{{STATIC_URL}}jar/plugin.jar
{{STATIC_URL}}jar/jackson-annotations-2.1.1.jar,
{{STATIC_URL}}jar/jackson-core-2.1.1.jar,
{{STATIC_URL}}jar/jackson-databind-2.1.1.jar"
>
<param name=id value="{{building.id}}">
<param name=piani value='{{floors}}'>
MAYSCRIPT
</applet>
The Java code for parsing the Json:
public static Floor[] parse(String input, URL codebase) {
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
BaseFloor[] bfloors=null;
try {
bfloors = mapper.readValue(input, BaseFloor[].class);
} catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i=0; i < bfloors.length; i++) {
Floor f = new Floor(bfloors[i]);
f.setCodeBase(codebase);
floors[i] = f;
}
return floors;
}
And here it's the error that I get in the Java console when I try to use it in the web page:
Exception in thread "thread applet-main.MapGenerator.class-1" java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonAutoDetect
at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>(VisibilityChecker.java:172)
at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:195)
at objects.Floor.parse(Floor.java:37)
at main.MapGenerator.loadParameters(MapGenerator.java:67)
at main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1698)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonAutoDetect
at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:252)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:250)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:180)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:161)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 7 more
So I tought about some strange implementation problem, and I tried with google-gson
As before here is the web page code:
<applet name="mapGenerator"
id="mapGenerator"
code="main.MapGenerator.class"
archive="{{STATIC_URL}}jar/MapGenerator.jar,
{{STATIC_URL}}jar/gson-2.2.2.jar,
{{STATIC_URL}}jar/plugin.jar
>
<param name=id value="{{building.id}}">
<param name=piani value='{{floors}}'>
MAYSCRIPT
</applet>
And the Java code:
public static Floor[] parse(String input, URL codebase) {
Gson gson = new Gson();
BaseFloor[] bfloors = gson.fromJson(input, BaseFloor[].class);
Floor[] floors = new Floor[bfloors.length];
for (int i=0; i < bfloors.length; i++) {
Floor f = new Floor(bfloors[i]);
f.setCodeBase(codebase);
floors[i] = f;
}
return floors;
}
I don't get any error running the applet on Eclipse, but when I go testing on a web page... I get another error:
java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:107)
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:84)
at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:66)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:71)
at com.google.gson.Gson.getAdapter(Gson.java:353)
at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
at com.google.gson.Gson.getAdapter(Gson.java:353)
at com.google.gson.Gson.fromJson(Gson.java:794)
at com.google.gson.Gson.fromJson(Gson.java:761)
at com.google.gson.Gson.fromJson(Gson.java:710)
at com.google.gson.Gson.fromJson(Gson.java:682)
at objects.Floor.parse(Floor.java:33)
at main.MapGenerator.loadParameters(MapGenerator.java:67)
at main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1698)
at java.lang.Thread.run(Thread.java:662)
Eccezione: java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)
Here is the class BaseFloor that I'm tryng to parse, it's in the same package of the static function:
package objects;
public class BaseFloor {
public int numero_di_piano;
public String link;
public String bearing;
public float getBearing() {
return Float.parseFloat(bearing);
}
public int getFloor() {
return numero_di_piano;
}
public String getLink() {
return link;
}
public String toString() {
return numero_di_piano + " " + bearing + " " + link;
}
}
And here is the JSON that I'm passing to the applet:
[{"bearing": "354.00", "link": "/media/floors/Foto_del_63333991-02-2455618_alle_17_35_6.jpg", "numero_di_piano": 0}, {"bearing": "354.00", "link": "/media/floors/IMG_20111009_171138_7.jpg", "numero_di_piano": 1}]
I'm curious: is it a problem of my implementation of the code, or is it a problem of security, because my applet isn't signed so the reflection cannot be used?
If you need something, ask freely.
Thank you in advance.
EDIT
I've tried what you suggested @Nikita, and the error changed!
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkMemberAccess(SecurityManager.java:1662)
at java.lang.Class.checkMemberAccess(Class.java:2157)
at java.lang.Class.getDeclaredMethods(Class.java:1790)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass._addMemberMethods(AnnotatedClass.java:593)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveMemberMethods(AnnotatedClass.java:421)
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:243)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropertiesCollector.java:442)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collect(POJOPropertiesCollector.java:232)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:142)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:81)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:11)
at com.fasterxml.jackson.databind.DeserializationConfig.introspect(DeserializationConfig.java:507)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:326)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:342)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:2898)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2792)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
at objects.Floor.parse(Floor.java:40)
at main.MapGenerator.loadParameters(MapGenerator.java:67)
at main.MapGenerator.start(MapGenerator.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1698)
at java.lang.Thread.run(Thread.java:662)
Eccezione: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)
Try to insert comma after {{STATIC_URL}}jar/plugin.jar
in your page. May be java plugin ignores jackson-annotations.jar because of this and you get NoClassDefFoundError
.
Here is a similar question: WEBAPP NoClassDefFound JsonAutoDetect and missing jackson-annotations
caused the problem.
这篇关于Java小程序不能解析JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!