当前位置: 首页 > 知识库问答 >
问题:

Protobuf映射类型JSON格式使用字符串文字“key”和“value”,而不是实际值

漆雕硕
2023-03-14

我试图使用com.googlecode.protobuf.format.jsonFormat将protobuf对象转换为JSON格式,但意外地出现了map类型。

我的留言是这样的

message Response {
   repeated Candidate candidates = 1;
   map<string, ErrorMessage> errors = 2;
}

message ErrorMessage {
   string message = 0;
   ErrorType type = 1;
}

enum ErrorType {
   ERROR = 0;
   WARNING = 1;
}

问题是我创建的response对象的JSON格式

Response response = ...
Return new ResponseEntity<>(new JsonFormat().printToString(response), HttpStatus.OK);

我希望错误被格式化为映射键的字符串值(映射键的)

...
"errors": {
  "someID" : {
      "message": "blah blah",
      "type": "ERROR"
  }
}

但是,实际输出是(我只计算了intellij中的new JsonFormat().printToString(response)部分)

...
"errors": {
  "key": "someID",
  "value": {
      "message": "blah blah",
      "type": "ERROR"
  }
}

我希望这是一些小配置,我错过了制作protobuf(或jackson?)要知道实际的键值?不使用“key”和“value”。

顺便说一句,在map类型中有文字“key”和“value”字段有什么意义?您不能使用它进行成分查找,您可以只使用自定义类型/对象。

共有1个答案

韩博厚
2023-03-14

这段代码非常适合我:

test.proto

syntax = "proto2";
package by.dev.madhead;
option java_outer_classname = "SO";

message Candidate {

}

enum ErrorType {
    ERROR = 0;
    WARNING = 1;
}

message ErrorMessage {
    required string message = 1;
    required ErrorType type = 2;
}

message Response {
    repeated Candidate candidates = 1;
    map<string, ErrorMessage> errors = 2;
}

App.java

public class App {
    public static void main(String[] args) throws InvalidProtocolBufferException {
        SO.Response response = SO.Response.newBuilder()
            .addCandidates(SO.Candidate.newBuilder().build())
            .addCandidates(SO.Candidate.newBuilder().build())
            .addCandidates(SO.Candidate.newBuilder().build())
            .putErrors("error1", SO.ErrorMessage.newBuilder().setMessage("error1").setType(SO.ErrorType.ERROR).build())
            .putErrors("error2", SO.ErrorMessage.newBuilder().setMessage("error2").setType(SO.ErrorType.WARNING).build())
            .build();

        System.out.println(JsonFormat.printer().print(response));
    }
}

输出为:

{
    "candidates": [{
    }, {
    }, {
    }],
    "errors": {
        "error1": {
            "message": "error1",
            "type": "ERROR"
        },
        "error2": {
            "message": "error2",
            "type": "WARNING"
        }
    }
}

它没有。确保您打印的不是消息本身,而是jsonFormat.printer().print()的结果。基本上,您看到的来自Protobuf消息的内部到String()实现。

JsonFormat的完整类名是com.google.protobuf.util.jsonFormat,而不是com.googlecode.protobuf.format.jsonFormat

 类似资料:
  • 问题内容: 我下面有String,其格式需要将其加载到地图中,因此我需要在逗号上分割,然后加载为键及其值。 我在这里使用Splitter为我完成这项工作,但在某些情况下失败了。对于我的某些字符串,value具有一些带等号的字符串。所以对于下面的字符串,它对我来说是失败的: 如何使它适用于上述情况?对于上述情况,将为,值应为。这可能吗? 问题答案: 您可以添加一个数字来表示要拆分多少个,只需添加2个

  • 问题内容: 我正在使用AttributeConverter将MySQL JSON列转换为Object,如https://stackoverflow.com/a/31547965/1633272所述 将数据存储到MySQL中时,它工作正常,我可以在WorkBench中看到正确的值。 但是,当将该列返回给Java应用程序时,一个Unicode字符映射为3个字符。 这是一个示例,JSON字符串 “中”

  • 这是显示类型列表动态不是类型映射字符串动态的子类型“现在当我运行模拟器时,显示”类型列表动态不是类型映射字符串动态的子类型“在我的模拟器上,我如何修复它? 现在我想创建关于查找api id的程序,从我的模拟器中使用文本字段和按钮,当我把一些数字和单击按钮时,会显示该ID的数据或标题,但我只是初学者,所以如果有人认为我的代码是正确的或不正确的或者你有推荐请告诉我 My JSON JSON代码 应用程

  • 问题内容: 我想创建一个地图,可以将其转换为json对象,例如 但是golang指定使用类型声明地图,因此我可以使用map [string] string或map [string] int。我如何创建上述的json对象? 注意:直到运行时或需要创建json对象时,我才知道需要哪些数据和/或类型。因此,我不能只创建像 问题答案: 您可以随时使用存储任何类型。如包装袋中的文件所述: 若要将JSON解组

  • 我有这个json字符串: 当我用Jackson将其转换为映射[字符串,对象]时,开始日期的类型是字符串,我如何告诉Jackson将其转换为日期时间类型?

  • 现在的Rust资料,无论是Book还是RustByExample都没有统一而完全的介绍Rust的操作符。一个很重要的原因就是,Rust的操作符号和C++大部分都是一模一样的。 一元操作符 顾名思义,一元操作符是专门对一个Rust元素进行操纵的操作符,主要包括以下几个: -: 取负,专门用于数值类型。 *: 解引用。这是一个很有用的符号,和Deref(DerefMut)这个trait关联密切。 !: