使用 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"}}