使用 List 解析 json 字符串时出现问题
issue with parsing json string with List
我已将 DOM 文档转换为 json 字符串。但是在List只有一个值,List有多个值的场景下,List的映射方式存在一些问题
例如:
1) DOM 文档转换为json 字符串后,这里的AlphaStatus List 只有一个值:
{
"Gamma": {
.
.
.
.
"AlphaStatuses": {
"AlphaStatus": {
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273661",
}
},
"Delta": {
...
}
}
}
2) DOM文档转换为json字符串后,这里的AlphaStatus List只有多个值,显示为:
{
"Gamma": {
.
.
.
.
"AlphaStatuses": {
"AlphaStatus": [
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273661",
},
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273662",
},
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "2016}2221122273663",
}
]
},
"Delta": {
...
}
}
}
我正在使用下面的杰克逊代码将 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 List 始终以 [{ 开头并以 } 结尾,无论它只有一个值还是多个值。这怎么能解决。
它在另一个系统中引起问题,该系统假定 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"}]}}}
首先,似乎是行
Object json = mapper.readValue(jObject.toString(), Object.class);
没用,因为你已经有一个对象(jObject)要序列化了。
就用它:
String output = mapper.writeValueAsString(jObject);
其次,您的问题字段似乎是 java.lang.Object 类型,对吗?
如果您为它分配一个值,它将产生一个 Json 对象:
jObject.setAlphaStatuses(alphaStatus);
-> 结果 -> {...}
如果您分配某种集合,它将产生一个 Json 数组:
jObject.setAlphaStatuses(Arrays.asList(alphaStatus1, alphaStatus2));
-> 结果 -> [{...},{...}]
为避免这种情况,要么始终传递一个列表,要么(如果您可以更改 class 的定义)使其成为一个集合(也许是一些列表)。
这里有一小段测试:
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;
}
}
}
和结果(不完全是你的结果,仅供演示):
{"alphaStatuses":[{"alphaHeaderKey":"A","alphaLineKey":"B"},{"alphaHeaderKey":"C","alphaLineKey":"D"}]}
{"alphaStatuses":{"alphaHeaderKey":"A","alphaLineKey":"B"}}
我已将 DOM 文档转换为 json 字符串。但是在List只有一个值,List有多个值的场景下,List的映射方式存在一些问题
例如: 1) DOM 文档转换为json 字符串后,这里的AlphaStatus List 只有一个值:
{
"Gamma": {
.
.
.
.
"AlphaStatuses": {
"AlphaStatus": {
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273661",
}
},
"Delta": {
...
}
}
}
2) DOM文档转换为json字符串后,这里的AlphaStatus List只有多个值,显示为:
{
"Gamma": {
.
.
.
.
"AlphaStatuses": {
"AlphaStatus": [
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273661",
},
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "201612221122273662",
},
{
"AlphaHeaderKey": "201612221122273660",
"AlphaLineKey": "2016}2221122273663",
}
]
},
"Delta": {
...
}
}
}
我正在使用下面的杰克逊代码将 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 List 始终以 [{ 开头并以 } 结尾,无论它只有一个值还是多个值。这怎么能解决。 它在另一个系统中引起问题,该系统假定 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"}]}}}
首先,似乎是行
Object json = mapper.readValue(jObject.toString(), Object.class);
没用,因为你已经有一个对象(jObject)要序列化了。
就用它:
String output = mapper.writeValueAsString(jObject);
其次,您的问题字段似乎是 java.lang.Object 类型,对吗?
如果您为它分配一个值,它将产生一个 Json 对象:
jObject.setAlphaStatuses(alphaStatus);
-> 结果 -> {...}
如果您分配某种集合,它将产生一个 Json 数组:
jObject.setAlphaStatuses(Arrays.asList(alphaStatus1, alphaStatus2));
-> 结果 -> [{...},{...}]
为避免这种情况,要么始终传递一个列表,要么(如果您可以更改 class 的定义)使其成为一个集合(也许是一些列表)。
这里有一小段测试:
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;
}
}
}
和结果(不完全是你的结果,仅供演示):
{"alphaStatuses":[{"alphaHeaderKey":"A","alphaLineKey":"B"},{"alphaHeaderKey":"C","alphaLineKey":"D"}]}
{"alphaStatuses":{"alphaHeaderKey":"A","alphaLineKey":"B"}}