web-dev-qa-db-ja.com

JSONデータをJavaオブジェクトに変換する

私のJavaアクションメソッド内でJSON文字列からプロパティにアクセスできるようにしたいです。文字列は単にmyJsonString = object.getJson()と言うことで利用できます。以下は、文字列がどのように見えるかの例です。

{
    'title': 'ComputingandInformationsystems',
    'id': 1,
    'children': 'true',
    'groups': [{
        'title': 'LeveloneCIS',
        'id': 2,
        'children': 'true',
        'groups': [{
            'title': 'IntroToComputingandInternet',
            'id': 3,
            'children': 'false',
            'groups': []
        }]
    }]
}

この文字列では、すべてのJSONオブジェクトに他のJSONオブジェクトの配列が含まれています。その目的は、他のJSONオブジェクトを含むグループプロパティを所有する任意のオブジェクトのIDのリストを抽出することです。私はGoogleのGsonを潜在的なJSONプラグインとして見ました。このJSON文字列からどのようにしてJavaを生成することができるかについて、誰かが何らかの形のガイダンスを提供できますか?

243
Binaryrespawn

私はGoogleのGsonを潜在的なJSONプラグインとして見ました。このJSON文字列からJavaを生成する方法について、何らかの形でガイダンスを提供できますか?

Google Gson ジェネリックとネストしたBeanをサポートします。 JSONの[]は配列を表し、 List のようなJavaコレクションまたは単なるJava配列にマップする必要があります。 JSONの{}はオブジェクトを表し、Java Map または単にいくつかのJavaBeanクラスにマップする必要があります。

いくつかのプロパティを持つJSONオブジェクトがあり、そのうちのgroupsプロパティは、まったく同じ型のネストしたオブジェクトの配列を表します。これはGsonで次のようにして解析できます。

package com.stackoverflow.q1688099;

import Java.util.List;
import com.google.gson.Gson;

public class Test {

    public static void main(String... args) throws Exception {
        String json = 
            "{"
                + "'title': 'Computing and Information systems',"
                + "'id' : 1,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Level one CIS',"
                    + "'id' : 2,"
                    + "'children' : 'true',"
                    + "'groups' : [{"
                        + "'title' : 'Intro To Computing and Internet',"
                        + "'id' : 3,"
                        + "'children': 'false',"
                        + "'groups':[]"
                    + "}]" 
                + "}]"
            + "}";

        // Now do the magic.
        Data data = new Gson().fromJson(json, Data.class);

        // Show it.
        System.out.println(data);
    }

}

class Data {
    private String title;
    private Long id;
    private Boolean children;
    private List<Data> groups;

    public String getTitle() { return title; }
    public Long getId() { return id; }
    public Boolean getChildren() { return children; }
    public List<Data> getGroups() { return groups; }

    public void setTitle(String title) { this.title = title; }
    public void setId(Long id) { this.id = id; }
    public void setChildren(Boolean children) { this.children = children; }
    public void setGroups(List<Data> groups) { this.groups = groups; }

    public String toString() {
        return String.format("title:%s,id:%d,children:%s,groups:%s", title, id, children, groups);
    }
}

かなり単純ですね。適切なJavaBeanを用意して Gson#fromJson() を呼び出すだけです。

また見なさい:

315
BalusC

GsonのBewaaaaare!それはとてもクールで、とても素晴らしいですが、単純なオブジェクト以外のことをしたいのなら、あなたは簡単にあなた自身のシリアライザを作り始める必要があるかもしれません(これはthat難しいことではありません)。

また、もしあなたがオブジェクトの配列を持っていて、そのオブジェクトの配列にいくつかのJSONを逆シリアル化するなら、本当の型は失われます!オブジェクト全体がコピーされることすらありません。 XStreamを使用してください。jsondriverを使用して適切な設定を設定すると、醜い型が実際のjsonにエンコードされるので、何も失うことはありません。真のシリアライゼーションのために支払うべき少額の価格(醜いjson)。

Jackson がこれらの問題を解決し、GSONより 速い であることに注意してください。

43
Jor

奇妙なことに、これまでに述べてきた唯一のまともなJSONプロセッサはGSONでした。

これがより良い選択です。

  • JacksonGithub ) - 強力なデータバインディング(POJOとの間のJSON)、ストリーミング(超高速)、ツリーモデル(型なしアクセスに便利)
  • Flex-JSON - 高度に設定可能なシリアル化

編集(2013年8月):

考慮すべきもう1つ:

  • Genson - Jacksonに似た機能で、開発者が設定しやすくすることを目的としています
25
StaxMan

またはジャクソンと:

String json = "...
ObjectMapper m = new ObjectMapper();
Set<Product> products = m.readValue(json, new TypeReference<Set<Product>>() {});
14
Gene De Lisa

何らかの変更により、すでに http://restfb.com/ を使用しているアプリケーションにいる場合は、次のようにします。

import com.restfb.json.JsonObject;

...

JsonObject json = new JsonObject(jsonString);
json.get("title");

等.

6
cherouvim

特殊なマップのキーや値を含む特殊なマップを使用している場合は、Googleの実装では考慮されていないことがわかります。

3
Juanma
HashMap keyArrayList = new HashMap();
Iterator itr = yourJson.keys();
while (itr.hasNext())
{
    String key = (String) itr.next();
    keyArrayList.put(key, yourJson.get(key).toString());
}
3
HEAT

JSONObjectJava Objectに変換するための簡単で実用的なJavaコード

Employee.Java

import Java.util.HashMap;
import Java.util.Map;

import javax.annotation.Generated;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"id",
"firstName",
"lastName"
})
public class Employee {

@JsonProperty("id")
private Integer id;
@JsonProperty("firstName")
private String firstName;
@JsonProperty("lastName")
private String lastName;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
*
* @return
* The id
*/
@JsonProperty("id")
public Integer getId() {
return id;
}

/**
*
* @param id
* The id
*/
@JsonProperty("id")
public void setId(Integer id) {
this.id = id;
}

/**
*
* @return
* The firstName
*/
@JsonProperty("firstName")
public String getFirstName() {
return firstName;
}

/**
*
* @param firstName
* The firstName
*/
@JsonProperty("firstName")
public void setFirstName(String firstName) {
this.firstName = firstName;
}

/**
*
* @return
* The lastName
*/
@JsonProperty("lastName")
public String getLastName() {
return lastName;
}

/**
*
* @param lastName
* The lastName
*/
@JsonProperty("lastName")
public void setLastName(String lastName) {
this.lastName = lastName;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

LoadFromJSON.Java

import org.codehaus.jettison.json.JSONObject;

import com.fasterxml.jackson.databind.ObjectMapper;

public class LoadFromJSON {

    public static void main(String args[]) throws Exception {
        JSONObject json = new JSONObject();
        json.put("id", 2);
        json.put("firstName", "hello");
        json.put("lastName", "world");

        byte[] jsonData = json.toString().getBytes();

        ObjectMapper mapper = new ObjectMapper();
        Employee employee = mapper.readValue(jsonData, Employee.class);

        System.out.print(employee.getLastName());

    }
}
3
Rahul Raina

標準的なものの何が問題になっていますか?

JSONObject jsonObject = new JSONObject(someJsonString);
JSONArray jsonArray = jsonObject.getJSONArray("someJsonArray");
String value = jsonArray.optJSONObject(i).getString("someJsonValue");
2
Kevin

ブーンを試してみてください。

https://github.com/RichardHightower/boon

それは速く邪悪です。

https://github.com/RichardHightower/json-parsers-benchmark

私のWordを理解しないでください...ガトリングベンチマークをチェックしてください。

https://github.com/gatling/json-parsers-benchmark

(最大4倍速は、場合によっては、数百回のテストのうちではありません。さらに高速なインデックスオーバーレイモードもあります。まだ若いですが、すでに何人かのユーザーがいます。)

他のlibがJSON DOMを解析するよりも速くJSONをMapsやListsに解析することができ、それはIndex Overlayモードがないことです。ブーンインデックスオーバーレイモードでは、さらに速くなります。

それはまた非常に速いJSON laxモードとPLISTパーサーモードを持っています。 :)(そして超低メモリを持ち、バイトモードから直接その場でUTF-8エンコーディングします)。

また、JavaBeanモードに対する最速のJSONもあります。

それは新しいですが、スピードとシンプルなAPIがあなたが探しているものであるならば、私はより速いかよりミニマリストのAPIがあるとは思わない。

0
RickHigh

入力JSON形式(文字列/ファイル)に応じてjSONStringを作成します。 JSONに対応するサンプルMessageクラスオブジェクトは以下のように取得できます。

メッセージmsgFromJSON = new ObjectMapper()。readValue(jSONString、Message.class);

0

最も簡単な方法は、jsonDataを特定のDtoクラスに変換できるカスタムメソッドであるこのsoftconvertvalueメソッドを使用できることです。

Dto response = softConvertValue(jsonData, Dto.class);


public static <T> T softConvertValue(Object fromValue, Class<T> toValueType) 
{
    ObjectMapper objMapper = new ObjectMapper();
    return objMapper
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .convertValue(fromValue, toValueType);
}
0
Dipen Chawla