将完整对象转换为JSON

问题描述

嗨,我有一个像这样的课程:

public class A {
String x;
String y;
String data;
}

变量x和y包含普通字符串,但变量数据包含JSON字符串,即'

x = "aaaa";
y = "bbbb";
data = "{\"key\":\"val\"}";

我要转换JSON中的完整对象,以使最终输出为:

{
x : "aaaa",y : "bbbb",data : {
      "key" : "val"
       }
}

我尝试使用new JSONObject(object)将对象转换为JSON。它对xy属性确实很好,但是data仍然是这样的字符串:

data : "{\\\"key\\\":\\\"value\\\"}"

。我也想一口气将data进行JSON化。

如何实现?

解决方法

最简单的方法是让您的data字段成为另一个对象。

public class Data {

   String key;
   String val;
}

和您的班级中

public class A { //Java classes start with uppercase

   String x;
   String y;
   Data data;
}
,

如果您不想修改该类或创建从其扩展的新类,则可以删除不必要的字符:

public class Main {

  public static void main(String[] args) {

    a obj = new a();
    obj.x = "aaaa";
    obj.y = "bbbb";
    obj.data = "{\"key\":\"val\"}";

    String str = new JSONObject(obj).toString().replaceAll("\\\\","")
            .replaceAll("\"\\{","{")
            .replaceAll("\\}\"","}");
    System.out.println(str);
  }
}

输出:

{"data":{"key":"val"},"x":"aaaa","y":"bbbb"}

或者您可以使用org.apache.commons.text.StringEscapeUtils.unescapeJson 轻松地完成工作。

,

鉴于OP对Doga Oruc的回答,这里是一种解决方法:从成员Data中读取您的String并使用Map<String,Object>类将该JSON字符串解析为JsonObject。然后将类A解析为JSON,然后解析回Map<String,Object>。在第二张地图中,用第一张地图的值替换键“数据”。这显然很麻烦,但这就是无法修改原始课程的代价

,

杰克逊这样的事情怎么样?

    class AWrapper {
        String x;
        String y;
        Object data;

        public AWrapper(A a,ObjectMapper mapper) throws IOException {
            this.x = a.x;
            this.y = a.y;
            this.data = mapper.readValue(a.data,Object.class);
        }

        public String getX() {
            return x;
        }
        public String getY() {
            return y;
        }
        public Object getData() {
            return data;
        }
    }

    class SomeClass {
        public static String toJson(A a) throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            AWrapper aWrapper = new AWrapper(a,mapper);
            return mapper.writeValueAsString(aWrapper);
        }
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...