如何将以下json字符串转换为java对象?

144

我想把下面的JSON字符串转换为Java对象:

String jsonString = "{
  "libraryname": "My Library",
  "mymusic": [
    {
      "Artist Name": "Aaron",
      "Song Name": "Beautiful"
    },
    {
      "Artist Name": "Britney",
      "Song Name": "Oops I did It Again"
    },
    {
      "Artist Name": "Britney",
      "Song Name": "Stronger"
    }
  ]
}"
我的目标是轻松访问它,类似于:
(e.g. MyJsonObject myobj = new MyJsonObject(jsonString)
myobj.mymusic[0].id would give me the ID, myobj.libraryname gives me "My Library").

我听说过Jackson,但我不确定如何使用它来适应我拥有的JSON字符串,因为由于“mymusic”列表的参与,它不仅仅是键值对。如何使用Jackson实现这个目标,或者如果Jackson不是最佳方案,是否有更简单的方法可以实现?


可能是将JSON字符串转换为Java对象?的重复问题。 - bummi
获取Json字符串的POJO - https://json2csharp.com/json-to-pojo - rakesh sinha
7个回答

259

不需要使用GSON来完成这个任务;Jackson可以处理普通的Map/List:

ObjectMapper mapper = new ObjectMapper();
Map<String,Object> map = mapper.readValue(json, Map.class);

或者更方便的JSON树形结构:

JsonNode rootNode = mapper.readTree(json);

顺便说一句,你完全可以创建Java类并更方便地执行它(在我看来):

public class Library {
  @JsonProperty("libraryname")
  public String name;

  @JsonProperty("mymusic")
  public List<Song> songs;
}
public class Song {
  @JsonProperty("Artist Name") public String artistName;
  @JsonProperty("Song Name") public String songName;
}

Library lib = mapper.readValue(jsonString, Library.class);

我尝试使用Jackson发送这种类型的JSON字符串,但它只返回空值:[{"id":62,"name":"projectname1","batchClassId":1283,"batchClassName":"sample_batchclass26","assetCount":0},{"id":8,"name":"projectname_tmp","batchClassId":1283,"batchClassName":"sample_batchclass26","assetCount":0}] - Madura Harshana
那是一个JSON数组,因此必须绑定到Java“Collection”(如“List”)或数组(可以使用类型“Object [] .class”)。或者只需绑定到“java.lang.Object”(将是类型为“List”)。它会正常工作。 - StaxMan
1
使用此网站将您的 JSON 转换为 Java POJO:http://www.jsonschema2pojo.org/。您还可以取消勾选 getters 和 setters,并使用 lombok 代替,以使 POJO 更加清晰。 - jellyDean
请问您能否提供一个将注释后的内容直接转换为Java对象的示例? - Dhruv Singhal
jsonschema2pojo也可以作为Maven插件使用。 - julaine

53

可以看一下谷歌的Gson:http://code.google.com/p/google-gson/

他们网站上说:

Gson gson = new Gson(); // Or use new GsonBuilder().create();
MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2

您只需要创建一个MyType类(当然要改名),并在其中添加json字符串中的所有字段。如果您想手动解析数组,这可能会变得有点复杂(但也很容易),请查看http://www.json.org/ 并下载Json解析器对象的Java源代码。


1
列表怎么样? - roghayeh hosseini
请点击此处@roghayehhosseini:https://dev59.com/questions/l2kw5IYBdhLWcg3w2-TH#59462393 - CodeSlave

8
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonObject object = (JsonObject) parser.parse(response);// response will be the json String
YourPojo emp = gson.fromJson(object, YourPojo.class); 

请添加一些描述来解释代码。谢谢! - Failed Scientist
3
JsonParser 已经过时! - H.Karatsanov

3

在我的情况下,我将JSON字符串作为列表传递。因此,在传递列表时,请使用以下解决方案。

ObjectMapper mapper = new ObjectMapper();
String json = "[{\"classifier\":\"M\",\"results\":[{\"opened\":false}]}]";
List<Map<String, Object>> map = mapper
    .readValue(json, new TypeReference<List<Map<String, Object>>>(){});

3

1

Underscore-java(我是开发者)可以将JSON转换为对象。

import com.github.underscore.U;

    String jsonString = "{\n" +
            "        \"libraryname\":\"My Library\",\n" +
            "                \"mymusic\":[{\"Artist Name\":\"Aaron\",\"Song Name\":\"Beautiful\"},\n" +
            "        {\"Artist Name\":\"Britney\",\"Song Name\":\"Oops I did It Again\"},\n" +
            "        {\"Artist Name\":\"Britney\",\"Song Name\":\"Stronger\"}]}";
    Map<String, Object> jsonObject = U.fromJsonMap(jsonString);
    System.out.println(jsonObject);

    // {libraryname=My Library, mymusic=[{Artist Name=Aaron, Song Name=Beautiful}, {Artist Name=Britney, Song Name=Oops I did It Again}, {Artist Name=Britney, Song Name=Stronger}]}

    System.out.println(U.<String>get(jsonObject, "mymusic[0].Artist Name"));
    // Aaron

-1
public void parseEmployeeObject() throws NoSuchFieldException, SecurityException, JsonParseException, JsonMappingException, IOException 
  {
   
      Gson gson = new Gson();
      
      ObjectMapper mapper = new ObjectMapper();

        // convert JSON string to Book object
        Object obj = mapper.readValue(Paths.get("src/main/resources/file.json").toFile(), Object.class);
        
        
        endpoint = this.endpointUrl;        

        String jsonInString = new Gson().toJson(obj);
    
      JsonRootPojo organisation = gson.fromJson(jsonInString, JsonRootPojo.class);
      
      
      for(JsonFilter jfil  : organisation.getSchedule().getTradeQuery().getFilter())
      {
         String name = jfil.getName();
         String value = jfil.getValue();
      }
      
      System.out.println(organisation);
      
  }

{
        "schedule": {
        "cron": "30 19 2 MON-FRI",
        "timezone": "Europe/London",        
        "tradeQuery": {
          "filter": [
            {
              "name": "bookType",
              "operand": "equals",
              "value": "FO"
            },
            {
              "name": "bookType",
              "operand": "equals",
              "value": "FO"
            }
          ],
          "parameter": [
            {
              "name": "format",
              "value": "CSV"
            },
            {
              "name": "pagesize",
              "value": "1000"
            }
          ]
        },
        "xslt" :""
        }
      
}


public class JesonSchedulePojo {
    
        public String cron;
        public String timezone;
        public JsonTradeQuery tradeQuery;
        public String xslt;
        
        
        public String getCron() {
            return cron;
        }
        public void setCron(String cron) {
            this.cron = cron;
        }
        public String getTimezone() {
            return timezone;
        }
        public void setTimezone(String timezone) {
            this.timezone = timezone;
        }
    
        public JsonTradeQuery getTradeQuery() {
            return tradeQuery;
        }
        public void setTradeQuery(JsonTradeQuery tradeQuery) {
            this.tradeQuery = tradeQuery;
        }
        public String getXslt() {
            return xslt;
        }
        public void setXslt(String xslt) {
            this.xslt = xslt;
        }
        @Override
        public String toString() {
            return "JesonSchedulePojo [cron=" + cron + ", timezone=" + timezone + ", tradeQuery=" + tradeQuery
                    + ", xslt=" + xslt + "]";
        }
        
        

public class JsonTradeQuery {
    
     public ArrayList<JsonFilter> filter;
        public ArrayList<JsonParameter> parameter;
        public ArrayList<JsonFilter> getFilter() {
            return filter;
        }
        public void setFilter(ArrayList<JsonFilter> filter) {
            this.filter = filter;
        }
        public ArrayList<JsonParameter> getParameter() {
            return parameter;
        }
        public void setParameter(ArrayList<JsonParameter> parameter) {
            this.parameter = parameter;
        }
        @Override
        public String toString() {
            return "JsonTradeQuery [filter=" + filter + ", parameter=" + parameter + "]";
        }
        
        
public class JsonFilter {

    public String name;
    public String operand;
    public String value;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getOperand() {
        return operand;
    }
    public void setOperand(String operand) {
        this.operand = operand;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return "JsonFilter [name=" + name + ", operand=" + operand + ", value=" + value + "]";
    }

public class JsonParameter {
    
    public String name;
    public String value;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return "JsonParameter [name=" + name + ", value=" + value + "]";
    }
    
    
public class JsonRootPojo {
    
    public JesonSchedulePojo schedule;

    public JesonSchedulePojo getSchedule() {
        return schedule;
    }

    

    public void setSchedule(JesonSchedulePojo schedule) {
        this.schedule = schedule;
    }



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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接