解析Java中用一个字符串连接的所有json

时间:2018-08-13 11:03:35

标签: java json jackson

我有许多串联在一起的json对象,需要解析所有对象。简单的例子:

String jsonStr = "{"name":"peter","age":40}{"name":"laura","age":50}"

使用杰克逊的ObjectMapper进行解析时,它会正确找到并读取第一个json,然后删除其余字符串。

ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonStr);
System.out.println(rootNode);

给出输出{"name":"peter","age":20}

是否有任何方式(在Jackson或其他框架中)例如返回读取的字符数,字符串的其余部分或JsonNode s的数组?

我在JavaScriptPython中发现了具有相同目标的问题,建议通过}{或正则表达式将其重新格式化为json数组,但我仍然希望以获得更优雅的解决方案。

4 个答案:

答案 0 :(得分:2)

在Json中,对象结构以{开始,以}结尾。因此,ObjectMapper认为一旦遇到},就没有其他要处理的东西了。

在Json中,数组用[]表示。因此,如果您希望有多个元素/对象,则需要用[]括起来,并用逗号分隔各个对象

"[
  {"name":"peter","age":40},
  {"name":"laura","age":50}
]"

答案 1 :(得分:2)

您不需要按照其他人的建议修改输入,只需使用以下代码即可。

主要方法

public static void main(String[] args) throws IOException {

    ObjectMapper mapper = new ObjectMapper();
    JsonFactory factory = new JsonFactory(mapper);

    JsonParser parser = factory.createParser(new File("config.json"));
    // factory.createParser(String) and many other overload methods
    // available, byte[], char[], InputStream etc.

    Iterator<Person> persons = parser.readValuesAs(Person.class);
    while(persons.hasNext()) {
        Person p = persons.next();
        System.out.printf("%s: %d%n", p.getName(), p.getAge());
    }
}

人员班

public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}  

config.json文件

{"name":"peter","age":40}{"name":"laura","age":50}

程序输出

peter: 40
laura: 50

已使用的库

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>

答案 2 :(得分:0)

您可以用方括号[]包装输入,然后用}{替换每个},{,最后将字符串解析为数组:

String input = "{\"name\":\"peter\",\"age\":40}{\"name\":\"laura\",\"age\":50}"
String jsonArray = "[" + input.replace("}{", "},{") + "]";

ObjectMapper mapper = new ObjectMapper();
JsonNode parsedJsonArray = mapper.readTree(jsonArray);

答案 3 :(得分:0)

您必须修改JSON

String jsonStr = "[{\"name\":\"peter\",\"age\":40},{\"name\":\"laura\",\"age\":50}]";

有多种方法可以将JSON转换为java对象。

第一种方式

public JsonNode convertIntoJsonNode(String jsonStr)
    {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = null;
        try {
            rootNode = objectMapper.readTree(jsonStr);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return rootNode;
    }

第二种方式 //检查是否也导入

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
// User Model
    class User{
        private String name;
        private Integer age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + "]";
        }
    }
//Coversion Method
public List<User> convertIntoObject(String jsonStr)
    {
        ObjectMapper objectMapper = new ObjectMapper();
        User[] myObjects = null;
        try {
            myObjects = objectMapper.readValue(jsonStr, User[].class);


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return Arrays.asList(myObjects);
    }

第三种无需数组即可直接解析的方法

public List<User> convertIntothirdway(String jsonStr)
    {
        ObjectMapper objectMapper = new ObjectMapper();
        List<User> userList = null;
        try {
             userList = objectMapper.readValue(jsonStr, new TypeReference<List<User>>(){});
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return userList;
    }

第四种方式

List<User> userList = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, User.class));