当前位置: 首页 > 知识库问答 >
问题:

使用MOXy将JSON字符串解封到某个“对象”

严信瑞
2023-03-14

我正在尝试使用MOXY编写一个方法来打印JSON字符串。所以我想要的是有一个像这样的方法

public String formatJson(String input) { ... }

我认为应该将字符串解析为一个通用对象(类似于SAX-Document,或类似的对象),然后使用一些格式化属性将该对象封送回JSON(这不是问题所在:-))。

[编辑]GSON和Jackson的例子被删除,因为只有MOXy才是问题所在。

我试过这个:

public static String toFormattedJson(final String jsonString) {
    String formatted;
    try {
        JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] { JAXBElement.class }, null);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        unmarshaller.setProperty(MEDIA_TYPE, MediaType.APPLICATION_JSON);
        unmarshaller.setProperty(JSON_INCLUDE_ROOT, true);
        StringReader reader = new StringReader(jsonString);
        Object element = unmarshaller.unmarshal(reader); // Exception is thrown here
        formatted = toFormattedJson(element);
    } catch (final JAXBException e) {
        formatted = jsonString;
    }
    return formatted;
}

但我有个例外

private static String toFormattedJson(Object obj) {
    String result;
    try (StringWriter writer = new StringWriter()) {
        final JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] { obj.getClass() }, null);
        final Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
        marshaller.setProperty(MarshallerProperties.JSON_REDUCE_ANY_ARRAYS, false);
        marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, false);
        marshaller.setProperty(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, false);
        marshaller.setProperty(JAXBContextProperties.JSON_INCLUDE_ROOT, true);
        marshaller.marshal(obj, writer);
        writer.flush();
        result = writer.toString();
    } catch (JAXBException | IOException e) {
        result = obj.toString();
    }
    return result;
}
String jsonString = "{\"p\" : [ 1, 2, 3]}";
{
   "p" : "1"
}

共有1个答案

拓拔富
2023-03-14

可以将String指定为反封送目标:

public static void main(String[] args) {
        System.out.println(toFormattedJson("[{\"test\":true}, \"ok\", [\"inner\",1]]"));
}

public static String toFormattedJson(final String jsonString) {
    String formatted;
    try {
        JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] { JAXBElement.class }, null);
        System.out.println("jaxbContext="+jaxbContext);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
        unmarshaller.setProperty(JAXBContextProperties.JSON_INCLUDE_ROOT, true);
        StringReader reader = new StringReader(jsonString);
        Object element = unmarshaller.unmarshal(new StreamSource(reader), String.class);
        formatted = toFormattedJsonElement(element);
    } catch (final JAXBException e) {
        e.printStackTrace();
        formatted = jsonString;
    }
    return formatted;
}

private static String toFormattedJsonElement(Object element) {
    return "formatted: " + element;
}
 类似资料:
  • 我在我的Jersey(2.7)项目中使用Moxy,基本上只是为了在服务发出响应时将我的对象整理为JSON。它工作得很好,但现在我也在使用ContainerResponseFilter对发出的每个响应进行一些更改,我不确定如何将请求体的内容解组到一个对象中,这是我需要的。 但我不确定是否有可能将它自动转换为一个对象。我需要的信息比较简单,所以我想我可以用另一种方式解析JSON,但我很好奇。 我试过找

  • null 杰克逊在默认情况下有能力做到这一点。

  • 我正在使用com。谷歌。格森。Gson将JSON字符串转换为Java对象的API: 我想知道javax.jsonapi中是否有等效的API来执行等效操作。谢谢!

  • 错误中的SOAP WSDL URL是Spring Boot应用程序中的另一个web服务。试图理解为什么这会出现在错误中。 UnmarshalException:意外元素(URI:“”,local:“message”)。需要的元素是<{http://soap_wsdl_url}jaxb_pojo_name>

  • 问题内容: 当我尝试将[] byte编组为JSON格式时,我只有一个奇怪的字符串。 请看下面的代码。 我有两个疑问: 如何将[] bytes封送至JSON? 为什么[] byte成为此字符串? 输出为: 戈朗游乐场:https : //play.golang.org/p/wanppBGzNR 问题答案: 根据文档:https : //golang.org/pkg/encoding/json/#Ma

  • 问题内容: 尝试解析最小值以在Android中映射时出现问题。 有一些示例JSON格式,其中包含更多信息,例如: 该示例最常使用且易于使用,仅使用或即可。 但是,我该如何解析仅使用字符串和值最小格式的这种JSON格式映射到使用循环的Java地图集合。而且因为字符串json总是会彼此不同。例如: 谢谢 问题答案: 您需要获取所有键的列表,对其进行循环,然后将它们添加到地图中,如下例所示: