当前位置: 首页 > 知识库问答 >
问题:

将json转换为对象

仉高昂
2023-03-14

我正试图将下面的json转换成java bean,需要你的帮助

Sort.json

{
  "messages": [
    {
      "GG_RETAIL_BRANCH_SAVING_SELLER": [
        "hello jackson 1",
        "hello jackson 2",
        "hello jackson 3"
      ]
    },
    {
      "GG_RETAIL_CONNECT_SAVINGS_SELLER": [
        "hello jackson 4",
        "hello jackson 5",
        "hello jackson 6"
      ]
    }
  ]
}

我的豆子看起来像

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Sort implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 8122222228160190915L;
    /*  private String name;
    private int age;*/
    private Map<String,List<String>> messages;

    @Override
    public String toString() {
        return "AdamSort [messages=" + messages + "]";
    }

    public Map<String, List<String>> getMessages() {
        return messages;
    }

    public void setMessages(Map<String, List<String>> messages) {
        this.messages = messages;
    }
}

我的测试课是

import java.io.File;
import java.io.IOException;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();

        try {           
            Sort sort = mapper.readValue(new File("C:\\Sort.json"), Sort.class);
            System.out.println(sort);

        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我看到的错误是

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token
 at [Source: C:\Sort.json; line: 2, column: 3] (through reference chain: com.test.Sort["messages"])
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212)
    at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:246)
    at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1817)
    at com.test.util.JacksonExample.main(JacksonExample.java:28)

请建议:

共有3个答案

呼延钱明
2023-03-14

根据json,java bean是不正确的。应该是:

import java.util.ArrayList;
import java.util.Map;

public class Sort {

    ArrayList<Map<String,ArrayList<String>>> messages;

    public ArrayList<Map<String, ArrayList<String>>> getMessages() {
        return messages;
    }

    public void setMessages(ArrayList<Map<String, ArrayList<String>>> messages) {
        this.messages = messages;
    }
}
欧阳成弘
2023-03-14

您的JSON翻译为:

public class Sort {
    private List<Message> messages;
}

public class Message {
    private List<String> GG_RETAIL_BRANCH_SAVING_SELLER;
}

因此,您可以使用此类类,也可以为杰克逊编写自定义反序列化程序。

更新:

好吧,试着用一个反序列化器:

    ObjectMapper mapper = new ObjectMapper();

    try {
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Sort.class, new SortDeserializer());
        mapper.registerModule(module);

这是类SortDeserializer

public class SortDeserializer extends StdDeserializer<Sort> {
    public SortDeserializer() { 
        this(null); 
    } 

    public SortDeserializer(Class<?> vc) { 
        super(vc); 
    }

    @Override
    public Sort deserialize(JsonParser jp, DeserializationContext dc)
            throws IOException, JsonProcessingException {
        Map<String,List<String>> messages = new HashMap<>();
        JsonNode node = jp.getCodec().readTree(jp);
        ArrayNode msgs = (ArrayNode)node.get("messages");
        for (JsonNode parm: msgs) {
            for (Iterator<String> it = parm.fieldNames(); it.hasNext(); ) {
                String key = it.next();
                ArrayNode values = (ArrayNode)parm.get(key);
                List<String> list = new ArrayList<>();
                for (JsonNode vnode: values) {
                    list.add(vnode.asText());
                }
                messages.put(key, list);
            }
        }
        Sort resp = new Sort();
        resp.setMessages(messages);
        return resp;
    }   
}
苍嘉澍
2023-03-14

查看JSON字符串时,消息是Map的列表。

替换地图

 类似资料:
  • 问题内容: 我有一个JSON对象,我将其转换为并在此处进行一些处理。稍后,我想转换相同的缓冲区数据以转换为有效的JSON对象。 我正在研究Node V6.9.1 下面是我尝试过的代码,但是当我转换回JSON却无法打开该对象时遇到了。 所以我尝试使用检查方式打印整个对象 如果我尝试像数组一样读取它 我也尝试解析它抛出 我需要将其视为我创建的真实对象(我的意思是像上面声明的那样)。 请帮忙.. 问题答

  • 问题内容: 这很简单,但是很挣扎。帮助我。 我有一个json数据{“ abc”:“ test”,“ bed”:“ cot”,“ help”:“ me”} 我想将上面的jsonObject转换为JSON ARRAY,例如[{“ abc”:“ test”,“ bed”:“ cot”,“ help”:“ me”}] 我只得到价值观。请帮我解决这个问题。 问题答案: 直接将JsonObject即obj放入

  • 问题内容: 我正在将struts2用于Action,将jquery用于UI … 我想知道如何将Map对象转换为JSON对象并将其发送回UI, 现在可以在JSP页面中将其打印为普通的Java Map对象: 但我希望它是这样的: 我将如何实现这一目标…? 问题答案: 尝试Gson: 不过,我不建议将这种代码放入JSP。诸如此类的事情应该存在于Servlet或Action类之类的控制器中。 您还绝对不希

  • 我需要将实体对象转换为json。我把 到 servlet 配置文件,因此 Spring 可以自动将对象转换为 json 格式。但Spring没有这样做。我还在项目中添加了杰克逊罐子。 控制器方法 小组学生 } 在浏览器中,我发现我有 406 错误和错误窗口错误[对象对象]。 如果有人知道问题出在哪里,我会很高兴得到帮助。 谢谢。

  • 我有一个JSON对象,我正在将它转换成一个,并在这里进行一些处理。稍后,我想将相同的缓冲区数据转换为有效的JSON对象。 我的工作节点V6.9.1 下面是我尝试过的代码,但当我转换回JSON并且无法打开此对象时,我得到了。 所以我试着用检查的方式打印整个物体 如果我试着像数组一样读取它 我试图解析它也抛出SynTaxError:意外令牌o在JSON在位置2 我需要像我创建的那样将其视为真实对象(我

  • 问题内容: 我正在尝试使用Django中的ValuesQuerySet功能将查询返回的字段数限制为仅需要的字段数。我想将此数据集序列化为JSON对象。但是,Django不断抛出错误。下面包含了我的代码和收到的错误: 错误: 谢谢 ! 问题答案: 尝试使用QuerySet 通过方法对值列表中的字段进行子集设置: