【问题标题】:Parsing json object into a string将json对象解析为字符串
【发布时间】:2013-03-12 01:05:04
【问题描述】:

我有一个关于我正在构建的 Web 应用程序的问题,我有一个接收 json 字符串的 REST 服务。

Json 字符串类似于:

{
    "string" : "value",
    "string" : "value", 
    "object" : {
                 "string" : "value",
                 "string" : "value",
                 ....
                }
}

我正在使用 resteasy 来解析下面使用 jackson 的 json 字符串。我有一个 jaxb 注释类,我想将“对象”完全解析为一个字符串变量。我想这样做的原因是以后能够使用正确的解析器解析 json(这取决于发送请求的应用程序,因此无法提前知道)。

我的 jaxb 注释类如下所示:

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Test{

@XmlElement(type = String.class)
private String object;

//getter and setter
...
}

当我执行 rest 调用并让 jackson 解析这段代码时,我得到一个

Can not deserialize instance of java.lang.String out of START_OBJECT token

错误。所以实际上我正在尝试将一段 json 字符串(它是一个 json 对象)解析为一个字符串。我似乎找不到有类似问题的人。

提前感谢您的任何回复。

【问题讨论】:

  • 必须是字符串吗?由于您使用的是 Jackson,我建议您将对象存储为 JsonNode。这应该可以很好地反序列化,然后您可以使用正确的解析器对其进行解析。
  • 根据我的分析师应该是:)。无论如何我都会尝试,如果有效,我会说服他。

标签: java json jaxb jackson resteasy


【解决方案1】:

@KwintenP 尝试使用json smart library

然后您可以先使用以下方法简单地检索 JSON 对象:

JSONObject test = (JSONObject) JSONValue.parse(yourJSONObject);
String TestString = test.toString();

更重要的是,您可以在 JSON 对象中检索特定对象,可能是另一个对象、数组并将其转换为字符串或以您想要的方式操作。

【讨论】:

    【解决方案2】:

    你也可以这样做;

    public class LeaderboardView
    {
         @NotEmpty
         @JsonProperty
         private String appId;
    
         @NotEmpty
         @JsonProperty
         private String userId;
    
         @JsonProperty
         private String name = "";
    
         @JsonProperty
         private String imagePath = "";
    
         @NotEmpty
         @JsonIgnore
         private String rank = "";
    
         @NotEmpty
         @JsonProperty
         private String score;
    
         public LeaderboardView()
         {
            // Jackson deserialization
         }
    

    }

    【讨论】:

      【解决方案3】:

      如果我理解这个问题,您只需要一种机制,将 Java-Object 转换为 JSON-String,反之亦然。

      我也需要这个,而我正在使用传递 JSON 字符串的 WebSocket 客户端-服务器通信。

      为此,我使用了 GSON(请参阅 GSON)。在那里你可以创建一个完整的 JSON 字符串。 这里有一些例子:

      // Converts a object into a JSON-String
      public String convertMyClassObjectToJsonFormat() {
        MyClass myObject = new MyClass();
        Gson gson = new Gson();
      
        return gson.toJson(myObject);
      }
      
      //Converts a JSON-String into a Java-Class-Object
      public MyClass convertJsonToMyClassObject(
                  CharBuffer jsonMessage) {
        Gson gson = new Gson();
      
        return gson.fromJson(jsonMessage.toString(),
                      MyClass.class);
      }
      

      您需要的是,您的 Class-Attributes-setter 和 JSON-Attribute-names 是等效的。例如

      {
         "info":[
            {
               "name": "Adam",
               "address": "Park Street"
            }
          ]
      }
      

      你的班级应该是这样的:

      public class Info{
       private String name;
       private String address;
      
       public void setName(String name){
        this.name = name;
       }
       public void setAddress(String address){
        this.address = address;
       }
      }
      

      【讨论】:

        【解决方案4】:
        java.lang.String out of START_OBJECT token
        

        这意味着"object" 之后的预期字符是引号",而不是括号{

        预期的 json

        "object" : "my object"
        

        实际的json

        "object" : { ...  
        

        =======
        如果您想像示例中那样解析 json,请更改您的课程。例如。

        @XmlRootElement
        @XmlAccessorType(XmlAccessType.PROPERTY)
        public class Test{
        
           @XmlElement
           private InnerTest object;
        
           //getter and setter
        ...
        }  
        
        @XmlAccessorType(XmlAccessType.PROPERTY)
        public class InnerTest{
        
           @XmlElement
           private String string;
        
           //getter and setter
        ...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-14
          • 1970-01-01
          • 2013-05-12
          • 2020-05-18
          相关资源
          最近更新 更多