通过以下简化示例:
我按预期得到以下内容:
{"person":{"name":"john","tags":["tag1","tag2"]}}
Run Code Online (Sandbox Code Playgroud)
但是,如果我只设置一个标签,我会得到这个:
{"person":{"name":"john","tags":"tag1"}}
Run Code Online (Sandbox Code Playgroud)
我期待得到这个:
{"person":{"name":"john","tags":["tag1"]}}
Run Code Online (Sandbox Code Playgroud)
也就是说,jettison删除了标签的数组,因为数组中只有一个元素.
我觉得这很不安全.
即使只有一个元素,如何强制jettison写一个数组?
注意:我知道还有其他替代方法,例如StAXON.但是,我在这里问如何使用Jettison实现这一目标.请不要建议另一种替代方案.
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.*;
import java.io.*;
import javax.xml.bind.*;
import javax.xml.stream.XMLStreamWriter;
import org.codehaus.jettison.mapped.*;
public class JettisonTest {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
Person person = new Person();
person.name = "john";
person.tags.add("tag1");
person.tags.add("tag2");
Configuration config = new Configuration();
MappedNamespaceConvention con = new MappedNamespaceConvention(config);
Writer writer = new OutputStreamWriter(System.out);
XMLStreamWriter xmlStreamWriter = new MappedXMLStreamWriter(con, writer);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(person, xmlStreamWriter);
}
} …Run Code Online (Sandbox Code Playgroud) 使用RestEasy JSON Provider Jettison(Badgerfish映射)与杰克逊之间的基本区别是什么?
使用这个的优点和缺点是什么?
我得到以下JSON:
[
{
"user_id": "someValue"
}
]
Run Code Online (Sandbox Code Playgroud)
它保存在String中.
我想将它转换为JSONObject失败的(因为构造函数假设一个JSON开始{).由于这似乎不可能,我想将其转换为JSONArray.我怎么能用SimpleJson做到这一点?
我正在使用JAXB以一种形式将带注释的对象编组为XML:
<channels>
<channel>Test A</channel>
<channel>Test B</channel>
</channels>
Run Code Online (Sandbox Code Playgroud)
我想使用JAXB(ala http://blog.bdoughan.com/2011/04/jaxb-and-json-via-jettison.html)将其编组为JSON,但它会对以下内容进行编组:
"channels" : {
"channel" : [ "Test A", "Test B" ]
},
Run Code Online (Sandbox Code Playgroud)
我真的希望它能够编组成以下形式:
"channels" : {
{"Test A"}, {"Test B"}
},
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这是正确的做法吗?
当RESTeasy将POJO编组为XML时,默认情况下它将跳过空值:请参阅Jaxb编组始终编写xsi:nil(即使@XmlElement(required = false,nillable = true))。
但是,封送至JSON时,将包含null属性。有什么方法可以强制JSON输出与XML输出匹配?
我在使用Spring Batch 2.1.9时遇到问题:当我使用jobExplorer.getJobExecution(jobExecutionId)时,当DAO必须反序列化一个字符串时,我发现了一个问题:
{"map":[{"entry":{"string":"parsedComparingDate","date":"2014-03-08 23:00:00.0 UTC"}}]}
Run Code Online (Sandbox Code Playgroud)
使用方法从BATCH_JOB_EXECUTION_CONTEXT表中获取JdbcJobExecutionDao.getJobExecution()。
我知道spring批处理使用xstream 1.3,但是在我的Pom中,我有:
此外,我读到xstream 1.3不能与jettison 1.3.3一起正常工作,但是使用xstream 1.3(不包括pom的xstream 1.4.1)可以正常工作,而使用xstream 1.4.1或主要版本时,我发现以下异常:
Caused by: java.lang.InstantiationError: java.util.Map$Entry
at sun.reflect.GeneratedSerializationConstructorAccessor1.newInstance(Unknown Source) [:1.6.0_23]
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [rt.jar:1.6.0_23]
at com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider.newInstance(Sun14ReflectionProvider.java:75) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:424) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:229) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:71) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.converters.collections.MapConverter.putCurrentEntryIntoMap(MapConverter.java:85) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:77) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:71) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.converters.collections.MapConverter.unmarshal(MapConverter.java:66) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) [xstream-1.4.1.jar:]
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) …Run Code Online (Sandbox Code Playgroud) 有一个Jettison的"功能",在2008年的JIRA入门中概述,其中涉及以下问题:
假设我要求"元素"的值为"00102"; 输出可能如下所示:
{ "Response":
{ "element": "00102" }
}
Run Code Online (Sandbox Code Playgroud)
但现在我将"element"设置为"102":
{ "Response":
{ "element": 102 }
}
Run Code Online (Sandbox Code Playgroud)
我理解Jettison正试图提供帮助......但是说真的,我不需要它代表我来决定这种事情.不,谢谢.
目前的解决方案
目前,我已经使用了用户在此处概述的解决方案,他将以下内容添加到bean配置中:
<bean id="simpleConverter" class="org.codehaus.jettison.mapped.SimpleConverter"/>
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="typeConverter" ref="simpleConverter"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
这部分地解决了这个问题,即使所有元素都被强制为字符串,即使它们是明显的整数.现在,至少,我确切地知道我的数据将保持什么结构,并且元素类型不会在不知情的情况下从字符串变为整数然后再返回.
问题
但是,我现在无法输出另一个元素作为整数,即使我现在希望这样做.似乎我只能强制元素的输出在整个服务中强制字符串,而不是基于每个元素.
除了'使用杰克逊'的建议(我不能遵循,因为框架显式使用Jettison)有没有其他方法我可以指定哪些元素我想强制作为我的JSON输出中的字符串?
我是REST服务的完全初学者,但我需要通过REST从网站访问一些信息.该服务有一些示例代码,以显示如何登录我使用过.示例代码使用Jettison作为JSON解析器,但是当我尝试运行以下代码片段时,我得到一个例外:
JSONObject post = baseResource.path("login")
.queryParam("service", "ABC").queryParam("auth", authParam)
.accept(MediaType.APPLICATION_JSON_TYPE).post(JSONObject.class);
Run Code Online (Sandbox Code Playgroud)
baseResourse是一个WebResource对象.代码失败,出现以下异常:
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException:
A message body reader for Java class org.codehaus.jettison.json.JSONObject, and
Java type class org.codehaus.jettison.json.JSONObject, and MIME media type
application/json; character=utf-8 was not found
Run Code Online (Sandbox Code Playgroud)
示例代码并不表示我应该添加任何"消息正文阅读器"来处理响应?或者我是否需要添加或执行任何明显的解析响应?谢谢.
我试图使用Jettison解析JSON对象.这是我正在使用的代码
String s ="{\"appUsage\":[{\"appName\":\"ANDROID\",\"totalUsers\":\"0\"},{\"appName\":\"IOS\",\"totalUsers\":\"4\"}]}";
JSONObject obj = new JSONObject(s);
ArrayList<MiAppUsage> l1 = (ArrayList<MiAppUsage>) jsonParser(ArrayList.class, obj);
public static Object jsonParser(Class c, JSONObject obj)
throws JSONException, XMLStreamException, JAXBException {
JAXBContext jc = JAXBContext.newInstance(c);
Configuration config = new Configuration();
MappedNamespaceConvention con = new MappedNamespaceConvention(config);
XMLStreamReader xmlStreamReader = new MappedXMLStreamReader(obj, con);
Unmarshaller unmarshaller = jc.createUnmarshaller();
ArrayList<MiAppUsage>customer = (ArrayList<MiAppUsage>) unmarshaller.unmarshal(xmlStreamReader);
return customer;
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误
线程"main"中的异常javax.xml.bind.UnmarshalException - 带有链接异常:[javax.xml.bind.UnmarshalException:unexpected element(uri:"",local:"appUsage").com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl上的com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(未知来源)中的预期元素为(none)]. un comrshal0(未知来源)com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(未知来源)com.json.UnmarshalDemo.jsonParser(UnmarshalDemo.java:56)com.json.UnmarshalDemo .main(UnmarshalDemo.java:33)引起:javax.xml.bind.UnmarshalException:意外元素(uri:"",local:"appUsage").com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError中的com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(未知来源)中的预期元素为(无). (未知来源)com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(未知来源)com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(未知)来自com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext $ defaultRootLoader.childElement(未知来源)com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(未知)来自com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(未知来源)的com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(未知来源)在com.sun.xml.internal.bind.v2.runtime.unmarshall的com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(未知来源)er.StAXStreamConnector.bridge(未知来源)... 4更多引起:javax.xml.bind.UnmarshalException:意外元素(uri:"",local:"appUsage").预期的要素是(无)......还有14个
如何解决这个问题
目前,我正在研究一个基于架构的 restFul 项目。因此,我们使用 JAXB 进行 XSD-->JAVA 转换。我有一个类如下:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"systemResponse"
})
@XmlRootElement(name = "RestResponse")
public class RestResponse implements Serializable {
private final static long serialVersionUID = 1L;
@XmlElementRef(name = "SystemResponse", namespace = "http://www.intuit.com/psd/cdm/v1", type = JAXBElement.class)
protected JAXBElement<? extends CdmComplexBase> systemResponse;
...
}
Run Code Online (Sandbox Code Playgroud)
这是它的序列化方式:
{"systemResponse":{"name":"{http://www.intuit.com/psd/cdm/v1}Transactions","declaredType":"com.intuit.psd.cdm.v1.Transactions","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"requestId":null,"requestName":null,"isEncrypted":null,"totalCount":null,"pageSize":null,"genDuration":null,"genDateTime":null,"transaction":[{"id":null,"externalKey":[],"metaData":null,"accountNumber":"12345678798","transactionNumber":null,"transactionReference":null,"batchID":null,"batchCycleDate":null,"paymentType":null,"paymentMethod":null,"transactionType":null,"cardType":null,"amount":null,"transactionDate":null,"authCode":null,"customerTransactionID":null,"ccnumberFirstSix":null,"ccnumberLastFour":null,"etctype":null,"posentryType":null}]},"nil":false,"globalScope":true,"typeSubstituted":false}}
Run Code Online (Sandbox Code Playgroud)
尝试反序列化时,出现以下异常:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class javax.xml.bind.JAXBElement<com.intuit.psd.cdm.v1.CdmComplexBase>]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: java.io.StringReader@725d9aa7; …Run Code Online (Sandbox Code Playgroud) 是否有通过使用索引删除存储在JSONArray中的JSONObject的直接方法.我尝试了所有的可能性.仍然无法从JSON数组中删除JSON对象.任何提示都会有所帮助谢谢
我有传入的JSON字符串,我需要解组到JAXB注释对象.我正在使用jettison这样做.JSON字符串如下所示:
{
objectA :
{
"propertyOne" : "some val",
"propertyTwo" : "some other val",
objectB :
{
"propertyA" : "some val",
"propertyB" : "true"
}
}
}
Run Code Online (Sandbox Code Playgroud)
ObjectA代码如下所示:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectA")
public class ObjectA {
@XmlElement(required = true)
protected String propertyOne;
@XmlElement(required = true)
protected String propertyTwo;
@XmlElement(required = true)
protected ObjectB objectB;
}
Run Code Online (Sandbox Code Playgroud)
ObjectB类代码如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectB")
public class ObjectB {
@XmlElement(required = true)
protected String propertyA;
@XmlElement(required = true)
protected boolean propertyB;
}
Run Code Online (Sandbox Code Playgroud)
用于解组的代码:
JAXBContext …Run Code Online (Sandbox Code Playgroud)