将JSON字符串转换为Java对象?

31

我一直在寻找与将JSON字符串转换为Java对象相关的示例,但没有找到任何好的示例。我找到的一个示例非常基础,并且并没有处理复杂的JSON字符串。

我正在开发一个应用程序,使用谷歌翻译API将字符串从英语翻译成不同的语言。谷歌对查询的响应是...以下文本格式化为JSON:

{"data":{"translations":[{"translatedText":"Bonjour tout le monde"}]}} 

到目前为止,我的方法是使用GSON API,但是我卡在了如何操作这个复杂的结果并创建Java对象上。

我的Java类是...

import com.google.gson.Gson;

public class JSONConverter {

private String traslatedText;

/**
 * Create an object of it self by manipulating json string
 * @param json type: String
 * @return String Translated text result from JSON responce
 */
public String getTranslation(String json){  
    Gson gson = new Gson();
    JSONConverter obj = gson.fromJson(json, JSONConverter.class);

    return obj.getTranslationForReturn();
}

/**
 * Method return a translation to a private call
 * @return String translation
 */
private String getTranslationForReturn(){
    return this.traslatedText;
 }
}

上述方法不起作用,因为我没有得到"Bonjour tout le monde"的返回值,

如果有人能够扩展我的理解,那将是一件非常愉快的事情。


你获得了一个 JSON 字符串,对吧?你也需要定义你的变量。然后你可以像 obj.translation 这样做来获取实际翻译。我以前从未在 Java 中处理过 JSON,所以我真的不知道你会如何定义那个变量。请查看你提供的链接中的示例2。虽然你有的字符串是嵌套的,但我真的不知道 gson 会如何解析它。 - Matt
1
这个问题看起来像是一个重复的:https://dev59.com/gXM_5IYBdhLWcg3wZSPX?rq=1 - Anderson Green
3个回答

38

编辑:你需要让你的Java数据类成为JSON的精确模型。

{"data":{"translations":[{"translatedText":"Bonjour tout le monde"}]}} 

变成:

class DataWrapper {
    public Data data;

    public static DataWrapper fromJson(String s) {
        return new Gson().fromJson(s, DataWrapper.class);
    }
    public String toString() {
        return new Gson().toJson(this);
    }
}
class Data {
    public List<Translation> translations;
}
class Translation { 
    public String translatedText;
}

随着对象模型变得更加复杂,org.json风格的代码变得越来越难以阅读,而gson/jackson风格的对象映射仍然只是普通的Java对象。

如果参数是"translated_text"带下划线,而内部类是"translatedText",那么这个变量的结果为null。我已经解决了这个问题:https://dev59.com/9FnUa4cB1Zd3GeqPfvyC#15907855 - Francis Rodrigues
当JSON字段与POJO字段名称不匹配时,可以使用Gson注释。 - Kevin
1
是的!@SerializeName("json_field") 这是一种方法。 - Francis Rodrigues

11

看这个 转换JSON为Java ,我猜你可以定义一个类作为对象并将其传递。所以,创建一些类并将其传递。

Data obj = gson.fromJson(json, Data.class);

class Data{
  public List<Data> getTranslation(){
     return translations;
  }
}

尝试类似于这样的东西。您可能需要进行一些实验。


谢谢你的回答,不过我选择第二个答案更为可接受。不过你的回答让我对Gson有了更清晰的理解...干杯! - TeaCupApp
@krio,没问题,但我会选择Kevin的回答。gson看起来更加时新和健壮。 - Matt

11

我通常喜欢使用纯粹的org.json库

用法如下:

 // make sure the quotes are escaped
String str = "{\"data\":{\"translations\":[{\"translatedText\":\"Bonjour tout le monde\"}]}}";
 // the object data is inside a "global" JSONObject
data = new JSONObject(str).getJSONObject("data");
// get a JSONArray from inside an object
JSONArray translations = data.getJSONArray("translations");
// get the first JSONObject from the array
JSONObject text = translations.getJSONObject(0);
// get the String contained in the object -> logs Bonjour tout le monde
Log.d("***>Text", text.getString("translatedText"));
也许代码量比我想象中的要少得多,但我会这样编写函数:
public String getTranslation(String json){  
  JSONObject data = new JSONObject(json).getJSONObject("data");
  return data.getJSONArray("translations").getJSONObject(0).getString("translatedText");
}

很高兴知道一个简单而新的方法!谢谢 - TeaCupApp
1
这太老派了,在现实世界中没有人再使用那个库了。很有趣,它被标记为正确答案。 - Kevin
3
@Kevin,对于这样一个简单的任务,我仍然认为这是最好的方法。只需两行代码,您就可以得到结果。使用Gson需要定义3个类才能获得相同的结果。我不否认它在其他情况下的优势,但我在这里看不出任何优势。 - Aleadam
这是正确的,Aleadam,但当你确实需要那些额外的东西时会发生什么呢?此外,这使得代码更加清晰易读,也更容易更新。Java不都是面向对象编程吗? - Matt
我在整个应用程序中使用相同的东西。您认为JSON解析或对象建模更好呢? - Shubham AgaRwal

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