我遇到了一个问题,试图将List作为根节点,但似乎无法获得此信息。让我解释。假设我们有一个类“ TestClass”
class TestClass{
String propertyA;
}
现在,在某些实用程序方法中,这就是我要做的
String utilityMethod(){
List<TestClass> list = someService.getList();
new ObjectMapper().writeValueAsString(list);
}
我想以JSON格式获取的输出是
{"ListOfTestClasses":[{"propertyA":"propertyAValue"},{"propertyA":"someOtherPropertyValue"}]}
我尝试使用
objMapper.getSerializationConfig().set(Feature.WRAP_ROOT_VALUE, true);
但是,我似乎仍然做得不好。
现在,我只是创建一个Map<String,TestClass>
,并编写该代码来实现我要执行的操作,该方法可以正常工作,但显然这是一个hack。有人可以帮我提供更优雅的解决方案吗?谢谢
不幸的是,即使WRAP_ROOT_VALUE
启用了该功能,您仍然需要额外的逻辑来控制序列化Java集合时生成的根名称(有关详细信息,请参阅此答案)。这给您提供以下选择:
ObjectWriter
下面的代码说明了三个不同的选项:
public class TestClass {
private String propertyA;
// constructor/getters/setters
}
public class TestClassListHolder {
@JsonProperty("ListOfTestClasses")
private List<TestClass> data;
// constructor/getters/setters
}
public class TestHarness {
protected List<TestClass> getTestList() {
return Arrays.asList(new TestClass("propertyAValue"), new TestClass(
"someOtherPropertyValue"));
}
@Test
public void testSerializeTestClassListDirectly() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
System.out.println(mapper.writeValueAsString(getTestList()));
}
@Test
public void testSerializeTestClassListViaMap() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
final Map<String, List<TestClass>> dataMap = new HashMap<String, List<TestClass>>(
4);
dataMap.put("ListOfTestClasses", getTestList());
System.out.println(mapper.writeValueAsString(dataMap));
}
@Test
public void testSerializeTestClassListViaHolder() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
final TestClassListHolder holder = new TestClassListHolder();
holder.setData(getTestList());
System.out.println(mapper.writeValueAsString(holder));
}
@Test
public void testSerializeTestClassListViaWriter() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
final ObjectWriter writer = mapper.writer().withRootName(
"ListOfTestClasses");
System.out.println(writer.writeValueAsString(getTestList()));
}
}
输出:
{“ ArrayList”:[{“ propertyA”:“ propertyAValue”},{“ propertyA”:“
someOtherPropertyValue”}]}
{“ ListOfTestClasses”:[{“ propertyA”:“ propertyAValue”},{“ propertyA”:“
someOtherPropertyValue “}]}
{” ListOfTestClasses“:[{” propertyA“:” propertyAValue“},{” propertyA“:”
someOtherPropertyValue“}]}
{” ListOfTestClasses“:[{” propertyA“:” propertyAValue“},{” propertyA “:”
someOtherPropertyValue“}]}
使用an ObjectWriter
非常方便-只需记住,使用它序列化的所有顶级对象都将具有相同的根名。如果那不是理想的,则使用map或holder类。
问题内容: 我遇到了一个问题,试图将List作为根节点,但似乎无法获得此信息。让我解释。假设我们有一个类“ TestClass” 现在,在某些实用程序方法中,这就是我要做的 我试图获取的JSON输出是 我尝试使用 但是,我似乎仍然做得不好。 现在,我只是创建一个Map ,并编写该代码来实现我要执行的操作,虽然可以,但是很明显这是一个hack。有人可以帮我提供更优雅的解决方案吗?谢谢 问题答案: 不
我有一个豆子类似于: 我正在尝试反序列化类似于以下内容的JSON: 我无法反序列化该对象,因为每个图像对象都包装在节点对象中,并集中在边对象中。 编辑:为了清楚起见,我不想通过使用bean来完成这一点,这个示例是一个简化,JSON有效负载中的所有数组项都包装在这个和表示中。
问题内容: 我用来填充包含HTML无序列表()的模板。 这些中的大多数没有那么长,但是有一些长度却很可笑,实际上可以容纳2-3列。 有没有HTML,ColdFusion或JavaScript(我接受jQuery解决方案)的方法可以轻松地做到这一点?为了节省一些滚动,不值得使用过于复杂的重量级解决方案。 问题答案: 所以我从A List Apart CSS Swag:Multi-ColumnList
我正在使用Jackson 2.4将对象序列化为JSON。 当我序列化对象列表时,如果某些元素为空,则结果字符串包含一些“空”字符串。 如何防止元素被序列化?是否有任何配置?我已经设置了! 下面是我的代码: 连载之后我得到了这个:
编辑:应你们中一些人的要求,我发布了我的真实数据结构和类。我没能让你更容易理解这个问题。 我在解决JacksonJSON数组元素时遇到问题,最终出现异常,我将在本文后面报告。 我有一个来自第三方提供商的冗长的JSON字符串: 我的Java合奏如下。 这是最外层的容器: 这是第一级容器: 这是最里面的层次: 最后,这是我的反序列化代码: 在极端综合法中,我试图将问题概括如下: 类有一个模块成员,它是
问题内容: 我正在寻找适当地描述JSON中的列元数据的方法,稍后由Newtonsoft对其进行解析以构建C#。这样,我希望解决一个没有行或没有列的a的问题,但是即使我传递一个空表,我也需要使用标签和希望的数据类型来创建列。 标准输入的示例: 输入表为空的示例: 当我使用解析此内容时,没有行,而且显然没有列。我正在寻找一种描述JSON正文中的列元数据的方法。 问题答案: 该附带Json.Net不输出