【问题标题】:Converting json string to java object?将json字符串转换为java对象?
【发布时间】:2011-08-30 02:04:43
【问题描述】:

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

我正在制作一个应用程序,使用谷歌翻译 api 将字符串从英语翻译成不同的语言。 Google 对查询的响应是...以下文本采用 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 会如何解析它。
  • 这个问题看起来像是重复的:stackoverflow.com/questions/1395551/…

标签: java android json api gson


【解决方案1】:

编辑: 您需要您的 java Data 类是 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”并且innerClass ii是“translatedText”,则该变量的结果为空。我已经解决了这个问题:stackoverflow.com/a/15907855/3332734
  • json字段与pojo字段名不匹配时有Gson注解。
  • 是的! @SerializeName("json_field") 这是一种方式。
【解决方案2】:

检查一下Converting JSON to Java,我想你可以将一个类定义为对象并传递它。所以,创建一些类并传递它。

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

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

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

【讨论】:

  • 感谢您的回答,但是我选择第二个答案更容易接受,但是您的回答使我对 Gson 的理解更加清楚......干杯
  • @krio,没关系,但我会选择 kevins 的回答。 gson 看起来更加更新和强大。
【解决方案3】:

我通常喜欢使用简单的org.json library

将其用作:

 // 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");
}

【讨论】:

  • 很高兴知道一个简单的新方法!谢谢
  • 那是超级老派,现实世界中再也没有人使用那个图书馆了。很有趣,它被标记为正确答案。
  • @Kevin 对于这么简单的任务,我仍然认为它是最好的方法。只需 2 个 LOC,即可获得结果。您必须定义 3 个类才能使用 Gson 获得相同的结果。我不会否认它在其他情况下的优势,但我在这里看不到任何东西。\
  • 那是真正的 Aleadam,但是当您确实需要这些额外的东西时会发生什么。此外,它还使其更清晰、更易于阅读和更新。 Java 都是关于 OO 编程的,不是吗?
  • 我在整个应用程序中使用相同的东西。我们对 JSON 解析或对象建模有何看法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2021-09-18
  • 2011-02-02
  • 2015-05-24
  • 2011-08-15
  • 2012-01-22
  • 2011-06-19
相关资源
最近更新 更多