如何将 json 数组拆分成字符串?
How to split json array into strings?
我有一个带有 json 对象数组的字符串,如下所示:
[{..},{..}, ...]
我想将此数组中的每个对象提取为字符串。数组长度未知,对象任意。
一种天真的方法可能是简单地拆分 "},{"
,但它在实践中行不通。当然,我可以将字符串反序列化为 Java 对象数组,然后将每个对象序列化为字符串,但这并不安全,因为最终输出可能不再是逐字节精确的输入(是一项要求。另外,性能可能是个问题)。
有什么想法吗?
使用 GSON Lib 尝试下面的代码 - 您也可以放置 json 个对象而不是字符串 LOCATION
public static void main(String[] args) {
String obj = "{'id':'joe','ts':'2014-12-02T13:58:23.801+0100','foo':{'bar':{'v1':50019820,'v2':0, 'v3':0.001, 'v4':-100, 'v5':0.000001, 'v6':0.0, 'b':true}}}".replace("'", "\"");
String string = String.format("[%s,%s,%s,%s]", obj , obj , obj , obj );
JsonParser parser = new JsonParser();
JsonArray arr = (JsonArray)parser.parse(string);
//JsonArray arr = o.getAsJsonArray();
Iterator<JsonElement> itr = arr.iterator();
while(itr.hasNext()){
JsonElement val = itr.next();
System.out.println(val);
}
}
试试这个代码:
public List<String> split(String jsonArray) throws Exception {
List<String> splittedJsonElements = new ArrayList<String>();
ObjectMapper jsonMapper = new ObjectMapper();
JsonNode jsonNode = jsonMapper.readTree(jsonArray);
if (jsonNode.isArray()) {
ArrayNode arrayNode = (ArrayNode) jsonNode;
for (int i = 0; i < arrayNode.size(); i++) {
JsonNode individualElement = arrayNode.get(i);
splittedJsonElements.add(individualElement.toString());
}
}
return splittedJsonElements;
}
我使用了 Jackson 库。
希望对您有所帮助!
好吧,我对post这段代码有点惭愧。它根本不是最佳选择,看起来很糟糕,但如果您想要完全不变的内容,它可能会引导您走向正确的方向。
enum ParserState {
READING_OBJECT,
READING_ARRAY
}
public static List<String> extractObjects(String array) throws ParseException {
ParserState state = ParserState.READING_ARRAY;
ArrayList<String> result = new ArrayList<String>();
StringBuilder currentObject = null;
int i = 0;
int parenthesisBalance = 0;
for (char c : array.toCharArray()) {
switch (c) {
case '{': {
if (state == ParserState.READING_ARRAY) {
state = ParserState.READING_OBJECT;
currentObject = new StringBuilder();
}
parenthesisBalance++;
currentObject.append(c);
break;
}
case '}': {
if (state == ParserState.READING_ARRAY) {
throw new ParseException("unexpected '}'", i);
} else {
currentObject.append(c);
parenthesisBalance--;
if (parenthesisBalance == 0) {
state = ParserState.READING_ARRAY;
result.add(currentObject.toString());
}
}
break;
}
default: {
if (state == ParserState.READING_OBJECT) {
currentObject.append(c);
}
}
}
i++;
}
return result;
}
我有一个带有 json 对象数组的字符串,如下所示:
[{..},{..}, ...]
我想将此数组中的每个对象提取为字符串。数组长度未知,对象任意。
一种天真的方法可能是简单地拆分 "},{"
,但它在实践中行不通。当然,我可以将字符串反序列化为 Java 对象数组,然后将每个对象序列化为字符串,但这并不安全,因为最终输出可能不再是逐字节精确的输入(是一项要求。另外,性能可能是个问题)。
有什么想法吗?
使用 GSON Lib 尝试下面的代码 - 您也可以放置 json 个对象而不是字符串 LOCATION
public static void main(String[] args) {
String obj = "{'id':'joe','ts':'2014-12-02T13:58:23.801+0100','foo':{'bar':{'v1':50019820,'v2':0, 'v3':0.001, 'v4':-100, 'v5':0.000001, 'v6':0.0, 'b':true}}}".replace("'", "\"");
String string = String.format("[%s,%s,%s,%s]", obj , obj , obj , obj );
JsonParser parser = new JsonParser();
JsonArray arr = (JsonArray)parser.parse(string);
//JsonArray arr = o.getAsJsonArray();
Iterator<JsonElement> itr = arr.iterator();
while(itr.hasNext()){
JsonElement val = itr.next();
System.out.println(val);
}
}
试试这个代码:
public List<String> split(String jsonArray) throws Exception {
List<String> splittedJsonElements = new ArrayList<String>();
ObjectMapper jsonMapper = new ObjectMapper();
JsonNode jsonNode = jsonMapper.readTree(jsonArray);
if (jsonNode.isArray()) {
ArrayNode arrayNode = (ArrayNode) jsonNode;
for (int i = 0; i < arrayNode.size(); i++) {
JsonNode individualElement = arrayNode.get(i);
splittedJsonElements.add(individualElement.toString());
}
}
return splittedJsonElements;
}
我使用了 Jackson 库。
希望对您有所帮助!
好吧,我对post这段代码有点惭愧。它根本不是最佳选择,看起来很糟糕,但如果您想要完全不变的内容,它可能会引导您走向正确的方向。
enum ParserState {
READING_OBJECT,
READING_ARRAY
}
public static List<String> extractObjects(String array) throws ParseException {
ParserState state = ParserState.READING_ARRAY;
ArrayList<String> result = new ArrayList<String>();
StringBuilder currentObject = null;
int i = 0;
int parenthesisBalance = 0;
for (char c : array.toCharArray()) {
switch (c) {
case '{': {
if (state == ParserState.READING_ARRAY) {
state = ParserState.READING_OBJECT;
currentObject = new StringBuilder();
}
parenthesisBalance++;
currentObject.append(c);
break;
}
case '}': {
if (state == ParserState.READING_ARRAY) {
throw new ParseException("unexpected '}'", i);
} else {
currentObject.append(c);
parenthesisBalance--;
if (parenthesisBalance == 0) {
state = ParserState.READING_ARRAY;
result.add(currentObject.toString());
}
}
break;
}
default: {
if (state == ParserState.READING_OBJECT) {
currentObject.append(c);
}
}
}
i++;
}
return result;
}