有一个被pb协议转为Srring的repeated字段数据,如何使用Java,把这个String转回repeated字段的list,注意如果使用T.Builder,那么需要import正确的包
时间: 2023-04-10 10:03:59 浏览: 149
可以使用com.google.protobuf.util.JsonFormat类中的静态方法fromJsonString()将String转换为Message对象,然后使用Message对象中的repeated字段的get方法获取list。具体代码如下:
String jsonString = "{'repeatedField': [1, 2, 3]}";
T.Builder builder = T.newBuilder();
JsonFormat.parser().ignoringUnknownFields().merge(jsonString, builder);
T message = builder.build();
List<Integer> repeatedList = message.getRepeatedFieldList();
需要注意的是,如果使用T.Builder,需要正确import T类所在的包。
相关问题
有一个被pb协议转为Srring的repeated字段数据,如何使用Java,把这个String转回repeated字段的list
可以使用Google的protobuf库中的parseFrom方法将String转换为repeated字段的list。具体代码如下:
```
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import com.google.protobuf.util.JsonFormat.Parser;
import com.google.protobuf.util.JsonFormat.Printer;
import java.util.List;
public class ProtoUtils {
public static <T> List<T> parseRepeatedFromJson(String json, Parser parser, T.Builder builder)
throws InvalidProtocolBufferException {
List<T> list = builder.getRepeatedFieldBuilder().build();
JsonFormat.parser().merge(json, builder);
list.addAll(builder.getRepeatedFieldBuilder().build());
return list;
}
}
```
其中,json是被pb协议转为String的repeated字段数据,parser是JsonFormat.parser(),builder是repeated字段的Builder。调用该方法即可将String转换为repeated字段的list。
有一个被pb协议转为Srring的repeated字段数据,如何把这个String转回repeated字段的list
可以使用protobuf库中的ParseFromString方法将String转换为protobuf消息对象,然后再通过反射获取repeated字段的值。具体代码如下:
```
// 定义protobuf消息类型
message MyMessage {
repeated int32 my_field = 1;
}
// 将protobuf消息对象转换为String
MyMessage message;
message.add_my_field(1);
message.add_my_field(2);
std::string str;
message.SerializeToString(&str);
// 将String转换为protobuf消息对象
MyMessage new_message;
new_message.ParseFromString(str);
// 获取repeated字段的值
const google::protobuf::Reflection* reflection = new_message.GetReflection();
const google::protobuf::FieldDescriptor* field = new_message.GetDescriptor()->FindFieldByName("my_field");
int size = reflection->FieldSize(new_message, field);
for (int i = 0; i < size; i++) {
int32_t value = reflection->GetRepeatedInt32(new_message, field, i);
std::cout << value << std::endl;
}
```
阅读全文