使用List解析json字符串的问题

时间:2017-01-05 17:27:53

标签: java json string string-parsing

我已将DOM文档转换为json String。但是,在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": {
            ...
        }
    }
}

我使用下面的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 List始终以[{和结束于}]开头,无论它只有一个值还是多个值。如何解决这个问题。 它导致另一个系统中出现问题,该问题假定AlphaStatus始终是List,并期望[{成为令牌的一部分。

感谢任何帮助。或者我应该在这种情况下使用一些字符串实用程序来解析AlphaStatus并替换为[{和}]。怎么做呢

2 个答案:

答案 0 :(得分:0)

@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"}]}}}

答案 1 :(得分:0)

首先,它似乎是

Object json = mapper.readValue(jObject.toString(), Object.class);

没用,因为你已经有了一个序列化的对象(jObject)。

使用它:

String output = mapper.writeValueAsString(jObject);

第二,似乎你的问题字段是java.lang.Object类型,对吧?

如果你为它分配一个值,它将产生一个单独的Json对象:

jObject.setAlphaStatuses(alphaStatus); - &gt;结果 - &gt; {...}

如果你指定某种类型的集合,它将产生一个Json数组:

jObject.setAlphaStatuses(Arrays.asList(alphaStatus1, alphaStatus2)); - &gt;结果 - &gt; [{...},{...}]

为了避免这种情况,要么总是传递一个列表,要么(如果你可以改变类的定义)将它变成一个Collection(可能是一些List)。

这是一个要测试的小片段:

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