2013-01-16 98 views
0

我一直在尝试使用gson从json字符串生成协议缓冲区消息。有没有人知道如果可以做到这一点?如何使用Gson从json构建协议缓冲区消息?

我已经尝试:

Gson gson = new Gson(); 
Type type = new TypeToken<List<PROTOBUFFMESSAGE.Builder>>() {}.getType(); 
List<PROTOBUFFMESSAGE.Builder> list = (List<PROTOBUFFMESSAGE.Builder>) gson.fromJson(aJsonString, type); 

Gson gson = new Gson(); 
Type type = new TypeToken<List<PROTOBUFFMESSAGE>>() {}.getType(); 
List<PROTOBUFFMESSAGE> list = (List<PROTOBUFFMESSAGE>) gson.fromJson(aJsonString, type); 

的JSON内的消息使用相同的名称在协议缓冲器即:

message PROTOBUFFMESSAGE { 
    optional string this_is_a_message = 1; 
    repeated string this_is_a_list = 2; 
} 

会导致JSON:

[ 
    { 
     "this_is_a_message": "abc", 
     "this_is_a_list": [ 
      "123", 
      "qwe" 
     ] 
    }, 
    { 
     "this_is_a_message": "aaaa", 
     "this_is_a_list": [ 
      "foo", 
      "bar" 
     ] 
    } 
] 

虽然获取生成正确数量PROTOBUFFMESSAGE的列表,它们包含所有的字段设置为null,所以我不知道这是否与映射出了问题,反射系统没有检测到protobuffs字段或其他东西。如果有人知道如何做到这一点,那就太好了。顺便说一句我在这里谈论Java。

编辑:

改变了JSON的名字:

 { 
      "thisIsAMessage_": "abc", 
      "thisIsAList_": [ 
       "123", 
       "qwe" 
      ] 
     } 

让德序列发生。而且它除了抛出名单的工作:

java.lang.IllegalArgumentException: Can not set com.google.protobuf.LazyStringList field Helper$...etc big path here...$PROTOBUFFMESSAGE$Builder.thisIsAList_ to java.util.ArrayList 
+1

如果用的protobuf然后'可选的字符串this_is_a_message = 1生成的消息开放代码;'将成为'私人字符串this_is_a_message_;'笔记最后下划线和setters/getters。 –

+0

@NikolayKuznetsov这样做的工作,但与语法'thisIsAMessage_'。现在的问题是,列表'thisIsAList_'是由一个'UnmodifiableLazyStringList'生成的,它在反序列化时抛出一个异常:\ – fmsf

+0

什么异常?反序列化意味着在接收端? –

回答

0

听起来像是你将不得不使用GsonBuilder建立一个Gson对象,编写并注册一个类型的适配器给它com.google.protobuf.LazyStringList对象。

0

相反发起Gson对象通过构造函数中使用这个片段的:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(LazyStringList.class, new TypeAdapter<LazyStringList>() { 

    @Override 
    public void write(JsonWriter jsonWriter, LazyStringList strings) throws IOException { 

    } 

    @Override 
    public LazyStringList read(JsonReader in) throws IOException { 
    LazyStringList lazyStringList = new LazyStringArrayList(); 

    in.beginArray(); 

    while (in.hasNext()) { 
     lazyStringList.add(in.nextString()); 
    } 

    in.endArray(); 

    return lazyStringList; 
    } 
});