解析传入的JSON并删除包装样板

时间:2016-11-10 09:52:50

标签: java json spring jackson

在我的程序中,我正在调用一个返回用户列表的api。然而,结果就像这样包装在样板中。

{
  "d": {
    "result" : [ ... here the actual lsit ... ]
  }
}

我想解析结果,但是我找不到从我的传入json字符串中删除“d”和“result”的简单方法

我开始为暂存用户实体创建自己的类,因为结果集与我的用户实体不完全匹配

class StagingUser {
    // same props as api response per user
}

我的想法是解析像这样的用户

private List<StagingUser> parseResult(@RequestBody List<StagingUser> stagingUsers) {
    return stagingUsers;
}

然而,它需要我摆脱样板结果

5 个答案:

答案 0 :(得分:3)

您可以使用gson库。 gson-2.8.0.jar

忽略“D”:

enter image description here

的Maven:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.0</version>
</dependency>

StagingUser:

public class StagingUser
{
    private String hi;
    private String name;
    private String lastName;

    public StagingUser()
    {

    }

    public String getHi ( )
    {
        return hi;
    }

    public void setHi ( String hi )
    {
        this.hi = hi;
    }

    public String getName ( )
    {
        return name;
    }

    public void setName ( String name )
    {
        this.name = name;
    }

    public String getLastName ( )
    {
        return lastName;
    }

    public void setLastName ( String lastName )
    {
        this.lastName = lastName;
    }


    @Override
    public String toString ( )
    {
        return "StagingUser [hi=" + hi + ", name=" + name + ", lastName=" + lastName + "]";
    }


}

JsonTest:

这是获取json字符串格式,解析忽略d包装器,然后将属性设置为StagingUsers。打印所有内容是为了提供信息

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class JsonTest
{

    public static void main ( String [ ] args )
    {
        String jsonInString = "{ \"d\": { \"result\" : [ \"hello\", \"Frank\", \"Provost\" ] } }";

        System.out.println ( "Printing JSON String" );
        System.out.println ( jsonInString );
        System.out.println (  );

        JsonParser parser =  new JsonParser();
        JsonObject jsonObject = parser.parse(jsonInString).getAsJsonObject().get("d").getAsJsonObject();
        JsonArray jsonArray =  jsonObject.get("result").getAsJsonArray();

        System.out.println ( "Printing result elements" );
        for( JsonElement property : jsonArray)
        {
            System.out.println ( property.getAsString ( ));
        }
        System.out.println (  );


        StagingUser user = new StagingUser ( );
        user.setHi ( jsonArray.get ( 0 ).getAsString ( ) );
        user.setName ( jsonArray.get ( 1 ).getAsString ( ) );
        user.setLastName ( jsonArray.get ( 2 ).getAsString ( ) );

        System.out.println ( "Printing POJO: " );
        System.out.println ( user.toString ( ) );
    }

}

输出:

  

打印JSON字符串

     

{“d”:{“result”:[“hello”,“Frank”,“Provost”]}}

     

打印结果元素

     

您好

     

     

普罗沃斯特

     

打印POJO:

     

StagingUser [hi = hello,name = Frank,lastName = Provost]

答案 1 :(得分:2)

以下是json字符串的解析逻辑:

JsonParser parser =  new JsonParser();
JsonElement jsonElement = parser.parse("YOUR_STRING");
JsonObject jsonObj = jsonElement.getAsJsonObject();
JsonObject d = jsonObj.get("d").getAsJsonObject();
JsonArray result =  d.get("result").getAsJsonArray();
Gson gson = new Gson();
for(int x = 0; x < result.size(); x++){
    JsonObject userOb = result.get(x).getAsJsonObject();
    User userObject = gson.fromJson( userOb , User.class);
}

在这里,User是你的班级。您需要添加com.google.gson库以运行代码。

答案 2 :(得分:1)

String jsonString = "{\"d\": {\"result\": [{\"firstname\": \"bob\", \"lastname\":\"boblast\"}, {\"firstname\": \"alice\", \"lastname\": \"alicelast\"}]}}";

JSONObject jsonObject = new JSONObject(jsonString);
System.out.println("JSONOBJECT: "+jsonObject);

JSONObject dObject = jsonObject.getJSONObject("d");
System.out.println("RESULTOBJECT: "+dObject);

JSONArray jsonArray = dObject.getJSONArray("result");

System.out.println("JSONARRAY: "+jsonArray);

您可以按照上面的代码中所述获得结果。

  • 首先获取&#34; d&#34;。
  • 的json对象
  • 获取结果的json对象。
  • 获取结果json对象的数组。

答案 3 :(得分:1)

使用here中的json.jar然后

import org.json.JSONObject;


public class JsonWalker {

    public static void main(String[] args) {
        new JSONObject("{\"d\":{\"result\" :[1,2,3,4]}}").getJSONObject("d").getJSONArray("result").toList().forEach(x->System.out.println(x));
    }

}

答案 4 :(得分:1)

我的建议是不要花费精力去除外部JSON。只需使用众多JSON框架中的一个将其映射到对象模型。然后只需从对象模型中提取所需内容并进一步处理它。