【问题标题】:How to Split a JSON string to two JSON objects in Java如何在 Java 中将 JSON 字符串拆分为两个 JSON 对象
【发布时间】:2019-03-15 23:42:21
【问题描述】:

我有一个JSON 对象如下:

{  
   "token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9",
   "user":{  
      "pk":17,
      "username":"user1",
      "email":"user1@gmail.com",
      "first_name":"",
      "last_name":""
   }
}

我正在尝试从中获取两个JSON 对象;令牌和用户。我尝试了两种不同的方法,但都失败了:

//response.body().string() is the above json object
JSONArray jsonArray = new JSONArray(response.body().string());

jsonObjectRoot = new JSONObject(response.body().string());

谁能告诉我如何将其拆分为两个 JSON 对象?

【问题讨论】:

  • 您使用哪种语言? JavaScript 还是 Java?
  • 它在 Android Studio 中的 Java 中

标签: java json org.json


【解决方案1】:

你可以解析一个json字符串

var obj = JSON.parse(jsonString);

您可以通过简单地寻址来过滤 json 对象的子部分

var token = obj.token;
var user = obj.user;

【讨论】:

  • 我不认为它是 Java?是吗?
  • 不是。这将是解决方案的 Javascript 方面,这不是您想要的。 ;)
【解决方案2】:

你可以这样拆分:

// source object
JSONObject sourceObject = new JSONObject(sourceJson);

String tokenKey = "token";
// create new object for token
JSONObject tokenObject = new JSONObject();

// transplant token to new object
tokenObject.append(tokenKey, sourceObject.remove(tokenKey));
// if append method does not exist use put
// tokenObject.put(tokenKey, sourceObject.remove(tokenKey));

System.out.println("Token object => " + tokenObject);
System.out.println("User object => " + sourceObject);

上面的代码打印:

Token object => {"token":["eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"]}
User object => {"user":{"last_name":"","pk":17,"first_name":"","email":"user1@gmail.com","username":"user1"}}

【讨论】:

  • 看起来 append 在 tokenObject.append 中没有解析
  • @NabatFarsi,您使用什么库以及哪个版本?你不要用org.json
  • 它在Android studio中的内置库,
  • @NabatFarsi,我猜是org.json。您至少可以显示 JSONObjectJSONArray 类的导入吗?
  • 你是对的它是org.Json,所以它可能是不同的版本,我会进一步研究它
【解决方案3】:

更安全/更简洁的方法是创建一个 POJO 并使用 Jackson 将您的 JSON 反序列化到其中。你的pojo:

public class MyObject {
    String token;
    User user;

    static class User {
        int pk;
        String username;
        String email;
        String first_name;
        String last_name;
    }
}

那么,当你想反序列化时:

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();
MyObject myObject = mapper.readValue(jsonString, MyObject.class);
String token = myObject.token;
User user = myObject.user;
...

【讨论】:

    【解决方案4】:

    我最近遇到了同样的情况,我使用了下面对我有用的代码:

        JSONObject jo1 = new JSONObject(output);
    
        JSONObject tokenObject = new JSONObject();
        tokenObject.put("token", jo1.get("token"));
        JSONObject userObject = new JSONObject();
        userObject.put("user", jo1.get("user"));
    

    这里我新建一个空的JSONObject,然后把从原来对象中检索到的对象放到新创建的JSONObject中。

    你也可以通过 sysout 来验证输出:

        System.out.println("token:" + tokenObject.get("token"));
        System.out.println("user:" + userObject.get("user"));
    

    在我的情况下输出:

    token::eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
    user:{"last_name":"","pk":17,"first_name":"","email":"user1@gmail.com","username":"user1"}
    

    【讨论】:

      【解决方案5】:

      是的。它是一个 JSON 字符串。 像这样使用

      JSONParser jparse=new JSONParser();
      JSONObject jObj=(JSONObject)jParse.parse(jsonString);
      

      jObj 现在将包含 json 对象。

      【讨论】:

        猜你喜欢
        • 2021-04-14
        • 2017-01-17
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        相关资源
        最近更新 更多