Java 使用列表解析json字符串时出现问题

Java 使用列表解析json字符串时出现问题,java,json,string,string-parsing,Java,Json,String,String Parsing,我已将DOM文档转换为json字符串。然而,在列表只有一个值而列表有多个值的场景中,列表的映射方式存在一些问题 例如: 1) 将DOM文档转换为json字符串后,此处AlphaStatus列表只有一个值: { "Gamma": { . . . . "AlphaStatuses": { "AlphaStatus": { "Alp

我已将DOM文档转换为json字符串。然而,在列表只有一个值而列表有多个值的场景中,列表的映射方式存在一些问题

例如: 1) 将DOM文档转换为json字符串后,此处AlphaStatus列表只有一个值:

{
    "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"}}