Java 使用列表解析json字符串时出现问题
我已将DOM文档转换为json字符串。然而,在列表只有一个值而列表有多个值的场景中,列表的映射方式存在一些问题 例如: 1) 将DOM文档转换为json字符串后,此处AlphaStatus列表只有一个值:Java 使用列表解析json字符串时出现问题,java,json,string,string-parsing,Java,Json,String,String Parsing,我已将DOM文档转换为json字符串。然而,在列表只有一个值而列表有多个值的场景中,列表的映射方式存在一些问题 例如: 1) 将DOM文档转换为json字符串后,此处AlphaStatus列表只有一个值: { "Gamma": { . . . . "AlphaStatuses": { "AlphaStatus": { "Alp
{
"Gamma": {
.
.
.
.
"AlphaStatuses": {
"AlphaStatus": {
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273661",
}
},
"Delta": {
...
}
}
}
2) 将DOM文档转换为json字符串后,此处AlphaStatus列表仅包含多个值,如下所示:
{
"Gamma": {
.
.
.
.
"AlphaStatuses": {
"AlphaStatus": [
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273661",
},
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273662",
},
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "2016}2221122273663",
}
]
},
"Delta": {
...
}
}
}
我使用以下jackson代码将xml字符串转换为json:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
Object json = mapper.readValue(jObject.toString(), Object.class);
String output = mapper.writeValueAsString(json);
我的问题是,如何确保AlphaStatus列表始终以[{开头,以}结尾,而不管它是只有一个值还是多个值。如何解决这个问题。
它导致另一个系统出现问题,该系统假定AlphaStatus始终是一个列表,并期望[{成为令牌的一部分
非常感谢您的帮助。或者在这种情况下,我应该使用一些字符串实用程序来解析AlphaStatus并替换为[{和}]。如何做到这一点
@JsonRootName("Gamma")
public class Gamma {
private AlphaStatuses AlphaStatuses;
// getters and setters
}
public class AlphaStatuses {
@JsonProperty("alphaStatus")
private List<AlphaStatus> alphaStatuses;
// getters and setters
}
public class AlphaStatus{
@JsonProperty("alphaHeaderKey")
private String alphaHeaderKey;
@JsonProperty("alphaLineKey")
private String alphaLineKey;
// getters and setters
}
**Test class**:
@Test
public void test() throws Exception {
Gamma gamma=new Gamma();
gamma.setAlphaStatuses(new AlphaStatuses(Arrays.asList(new AlphaStatus("201612221122273660","201612221122273660"))));
ObjectMapper mapper=new ObjectMapper();
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE,true);
String jsonString=mapper.writeValueAsString(gamma);
System.out.println("output "+jsonString);
}
**Output**:
output {"Gamma":{"alphaStatues":{"alphaStatus":[{"alphaHeaderKey":"201612221122273660","alphaLineKey":"201612221122273660"}]}}}
公共类伽马射线{
私人alphastatus alphastatus;
//接球手和接球手
}
公共类字母状态{
@JsonProperty(“alphaStatus”)
私有列表状态;
//接球手和接球手
}
公共类字母状态{
@JsonProperty(“alphaHeaderKey”)
私有字符串alphaHeaderKey;
@JsonProperty(“alphaLineKey”)
私有字符串字母键;
//接球手和接球手
}
**测试类别**:
@试验
public void test()引发异常{
伽马=新伽马();
gamma.setalphastatus(新AlphaStatus(Arrays.asList)(新AlphaStatus(“20161221122273660”,“20161221122273660”)));
ObjectMapper mapper=新的ObjectMapper();
configure(SerializationFeature.WRAP\u ROOT\u值,true);
字符串jsonString=mapper.writeValueAsString(gamma);
System.out.println(“输出”+jsonString);
}
**产出**:
输出{“Gamma”:{“alphaStatus”:{“alphaStatus”:[{“alphaHeaderKey”:“20161221122273660”,“alphaLineKey”:“20161221122273660”}}}}
首先,它似乎是一条线
Object json=mapper.readValue(jObject.toString(),Object.class);
是无用的,因为您已经有了一个要序列化的对象(jObject)
只要使用它:
String output=mapper.writeValueAsString(jObject);
其次,您的问题字段的类型似乎是java.lang.Object,对吗
如果您为其分配一个值,它将生成一个Json对象:
jObject.setalphastatus(alphaStatus);
->result->{…}
如果您分配某种类型的集合,它将生成一个Json数组:
jObject.setalphastatus(Arrays.asList(alphaStatus1,alphaStatus2));
->-result->[{…},{…}]
为了避免这种情况,要么总是传递一个列表,要么(如果可以更改类的定义)将其放入集合(可能是某个列表)
下面是一个要测试的小片段:
import java.util.Arrays;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonObjects {
private final static ObjectMapper mapper = new ObjectMapper();
private final static AlphaStatus as1 = new AlphaStatus();
private final static AlphaStatus as2 = new AlphaStatus();
static {
as1.setAlphaHeaderKey("A");
as1.setAlphaLineKey("B");
as2.setAlphaHeaderKey("C");
as2.setAlphaLineKey("D");
}
public static void main(String[] args) throws JsonProcessingException {
final Gamma gamma = new Gamma();
gamma.setAlphaStatuses(Arrays.asList(as1, as2));
System.out.println(mapper.writeValueAsString(gamma));
gamma.setAlphaStatuses(as1);
System.out.println(mapper.writeValueAsString(gamma));
}
static class Gamma {
Object alphaStatuses;
public Object getAlphaStatuses() {
return alphaStatuses;
}
public void setAlphaStatuses(Object alphaStatuses) {
this.alphaStatuses = alphaStatuses;
}
}
static class AlphaStatus {
String alphaHeaderKey;
String alphaLineKey;
public String getAlphaHeaderKey() {
return alphaHeaderKey;
}
public void setAlphaHeaderKey(String alphaHeaderKey) {
this.alphaHeaderKey = alphaHeaderKey;
}
public String getAlphaLineKey() {
return alphaLineKey;
}
public void setAlphaLineKey(String alphaLineKey) {
this.alphaLineKey = alphaLineKey;
}
}
}
结果(不完全是您的结果,仅用于演示):
你是说这些都是从同一个xml片段生成的还是从不同的xml片段生成的。无论哪种方式,你都可以包含xml。谢谢Barath&Kevin。当我将其更改为列表时,它确实解决了问题。@gautham,如果这篇文章对你有帮助的话。请投票表决,因为这很重要。
{"alphaStatuses":[{"alphaHeaderKey":"A","alphaLineKey":"B"},{"alphaHeaderKey":"C","alphaLineKey":"D"}]}
{"alphaStatuses":{"alphaHeaderKey":"A","alphaLineKey":"B"}}