私は未知の値を持つオブジェクトを持っています。
{
"data": [
{"a":...,
"dont_know_what_else_is_here":....}
]
}
そして、「データ」の値を文字列として変数/データベースに保存したいだけです。
ストリーミング API からどのように読み取る必要がありますか?
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
キーと値のペアに従って、マップ内のデータを取得できます。
Map<String, Object> mp = mapper.readValue(new File("xyz.txt"),new TypeReference<Map<String, Object>>() {});
マップから値を取得します。
mp.get("data");
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());
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);
最後に、チュートリアルページを読んで解決策を見つけました。
ここで他の人にポインタを与えるために:
パーサーを作成するときに MappingJSONFactory を使用するように切り替えます。
HttpResponse response = client.execute(request);
JsonFactory jfactory = new MappingJsonFactory();
JsonParser parser=jfactory.createJsonParser(response.getEntity().getContent());
それからあなたはただすることができます
parser.readValueAsTree().toString();
または、必要に応じて解析します。
で使用する場合は、このメソッドを使用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()
ストリーミング API を使用して入力からサブツリーを読み取りたいだけだと思いますが、最終的には、サブツリー全体を 1 つのものとして DB (または変数) に格納する必要があります。
したがって、おそらく使用したいのは、JsonParser.readValueAs(MyType.class)
これが呼び出されることです(そして、それが機能するためには、アクセス元からObjectMapper
パーサーを作成する必要があります。または、を呼び出す必要があります)。JsonFactory
ObjectMapper
JsonFactory.setCodec(mapper)
内容が恣意的な場合は、Map
またはとして読むことができますJsonNode
:
Map<String,Object> map = parser.readValueAs(Map.class);
// or
JsonNode root = parser.readValueAsTree();
JsonParser
データバインドする JSON オブジェクトの START_ELEMENT を指しているとすぐに。