40

私は未知の値を持つオブジェクトを持っています。

{
 "data": [
    {"a":...,
    "dont_know_what_else_is_here":....}
 ]
}

そして、「データ」の値を文字列として変数/データベースに保存したいだけです。

ストリーミング API からどのように読み取る必要がありますか?

4

9 に答える 9

57

このオブジェクトをすでに読み込んでいる場合はJsonNode、次のように実行できます。

String content = jsonNode.get("data").textValue();

UPD:ストリーミングパーサーを使用しているので、 Jacksonの使用法に関するこの例が役立つ場合があります。

UPD:メソッド名はtextValue()になりました-docs

于 2013-02-05T08:22:07.843 に答える
30

JsonNode から文字列形式でデータを取得しようとする場合、通常はasTextを使用しますが、代わりにtextValueを使用する必要があります。

asText : ノードが値ノードの場合 (メソッド isValueNode() が true を返す)、コンテナー値の有効な文字列表現を返すメソッド。それ以外の場合は空の文字列。

textValue : String 値へのアクセスに使用するメソッド。非文字列値ノードの変換は行いません。非文字列値 (isTextual() が false を返す値) の場合は null が返されます。文字列値の場合、null は返されません (ただし、空の文字列は返される場合があります)。

では、例を挙げましょう。

JsonNode getJsonData(){
    ObjectMapper mapper = new ObjectMapper();
    ObjectNode node = mapper.createObjectNode(); 
    node.put("anyParameter",null);
    return node;
}
JsonNode node = getJsonData();
json.get("anyParameter").asText() // this will give output as "null"
json.get("").textValue() // this will give output as null
于 2016-10-19T14:26:00.323 に答える
6

キーと値のペアに従って、マップ内のデータを取得できます。

Map<String, Object> mp = mapper.readValue(new File("xyz.txt"),new TypeReference<Map<String, Object>>() {});

マップから値を取得します。

mp.get("data");
于 2013-02-05T09:58:24.163 に答える
3

JSON結果のEntityクラスをいくつか持つことができます。

String json = "your_json";
ObjectMapper mapper = new ObjectMapper();
Entity entity = mapper .readValue(json, Entity.class);
// here you can do everything with entity as you wish

// to write Entity value as String when you wish
String text = mapper.writeValueAsString(object);
// to write Entity child's value as String when you wish (let's data contain data part)
String data = mapper.writeValueAsString(object.getData());
于 2013-02-05T08:59:21.747 に答える
1

User( Taken from this )という POJO Java クラスがあるとします。

public class User {
public enum Gender { MALE, FEMALE };

public class Name {
    private String _first, _last;

    public String getFirst() { return _first; }
    public String getLast() { return _last; }

    public void setFirst(String s) { _first = s; }
    public void setLast(String s) { _last = s; }
}

private Gender _gender;
private Name _name;
private boolean _isVerified;
private byte[] _userImage;

public Name getName() { return _name; }
public boolean isVerified() { return _isVerified; }
public Gender getGender() { return _gender; }
public byte[] getUserImage() { return _userImage; }

public void setName(Name n) { _name = n; }
public void setVerified(boolean b) { _isVerified = b; }
public void setGender(Gender g) { _gender = g; }
public void setUserImage(byte[] b) { _userImage = b; }

}

これで、Web ソケットなどのどこかから来る JSON 文字列ができました。例として、これが取得している文字列であると仮定します。

String json = "{\n" +
            "  \"name\" : { \"first\" : \"Joe\", \"last\" : \"Sixpack\" },\n" +
            "  \"gender\" : \"MALE\",\n" +
            "  \"verified\" : false,\n" +
            "  \"userImage\" : \"Rm9vYmFyIQ==\"\n" +
            "}";

これで、このコードを使用するだけで、この JSON 文字列を POJO オブジェクトに変換できます。

ObjectMapper mapper = new ObjectMapper();
User user = mapper .readValue(json, User.class);
于 2015-11-03T06:15:28.333 に答える
0

最後に、チュートリアルページを読んで解決策を見つけました。

ここで他の人にポインタを与えるために:

  1. パーサーを作成するときに MappingJSONFactory を使用するように切り替えます。

        HttpResponse response = client.execute(request);
        JsonFactory jfactory = new MappingJsonFactory();
        JsonParser parser=jfactory.createJsonParser(response.getEntity().getContent());
    
  2. それからあなたはただすることができます

        parser.readValueAsTree().toString();
    

または、必要に応じて解析します。

于 2013-02-05T15:18:15.150 に答える
0

で使用する場合は、このメソッドを使用String dataしてcreateParser(data)、ストリーミング API で文字列コンテンツを収集します。

if ("data".equals(fieldname))
     String strData = getValueAsString(jp);

    private static String getValueAsString(JsonParser jp)
        throws com.fasterxml.jackson.core.JsonParseException, IOException {
    JsonToken token = jp.getCurrentToken();
    int counter = 0;

    long startIndex = jp.getCurrentLocation().getCharOffset();
    long endIndex = 0;

    if (token == JsonToken.START_OBJECT) {
        // JsonLocation location = jp.getCurrentLocation();
        // startIndex = location.getCharOffset();
        // System.out.println(",location=" + new Gson().toJson(location) +
        // ", start=" + startIndex);

        counter++;
        while (counter > 0) {
            token = jp.nextToken();
            if (token == JsonToken.START_OBJECT)
                counter++;
            if (token == JsonToken.END_OBJECT) {
                counter--;
                endIndex = jp.getCurrentLocation().getCharOffset();
            }
        }

        return data.substring((int) startIndex - 1, (int) endIndex);

    } else if (token == JsonToken.START_ARRAY) {
        counter++;
        while (counter > 0) {
            token = jp.nextToken();
            if (token == JsonToken.START_ARRAY)
                counter++;
            if (token == JsonToken.END_ARRAY) {
                counter--;
                endIndex = jp.getCurrentLocation().getCharOffset();
            }
        }
        return data.substring((int) startIndex - 1, (int) endIndex);

    } else {
        return jp.getText();
    }
}

データソースが文字列の場合に機能します。ファイルなどの文字列ソースがない場合、JsonLocation.getByteOffset()代わりに使用JsonLocation.getCharOffset()

于 2015-07-29T09:27:06.967 に答える
0

ストリーミング API を使用して入力からサブツリーを読み取りたいだけだと思いますが、最終的には、サブツリー全体を 1 つのものとして DB (または変数) に格納する必要があります。

したがって、おそらく使用したいのは、JsonParser.readValueAs(MyType.class)これが呼び出されることです(そして、それが機能するためには、アクセス元からObjectMapperパーサーを作成する必要があります。または、を呼び出す必要があります)。JsonFactoryObjectMapperJsonFactory.setCodec(mapper)

内容が恣意的な場合は、Mapまたはとして読むことができますJsonNode:

Map<String,Object> map = parser.readValueAs(Map.class);
// or
JsonNode root = parser.readValueAsTree();

JsonParserデータバインドする JSON オブジェクトの START_ELEMENT を指しているとすぐに。

于 2013-02-06T04:58:10.063 に答える