Json.NET到GSON,可能是新手问题



我在。net中有一个应用程序,我希望能够与Android应用程序交谈。一些研究建议不使用XML,我通常的选择,而是使用JSON,我从未接触过。我用的是Json。. NET和GSON.

我有一个简单的类在。net;

public enum eCommandType
{
    UNKNOWN,
    PING,
    GET_TIMINGS,
    GET_EVENT_ID,
    NEW_EVENT,
    LOAD_PEOPLE,
    LOAD_TAGS,
    SET_LOCATION
}
public class CommandBase
{
    [JsonConverter(typeof(StringEnumConverter))]
    public eCommandType CommandType { get; set; }
}

我使用

生成一个模式
        //Encode enums as strings, not integers.
        JSchemaGenerator stringEnumGenerator = new JSchemaGenerator();
        stringEnumGenerator.GenerationProviders.Add
            (new StringEnumGenerationProvider());
        JSchema schema = stringEnumGenerator.Generate(typeof(CommandBase));
        string s = schema.ToString();

模式是

{
  "type": "object",
  "properties": {
    "CommandType": {
      "type": "string",
      "enum": [
        "UNKNOWN",
        "PING",
        "GET_TIMINGS",
        "GET_EVENT_ID",
        "NEW_EVENT",
        "LOAD_PEOPLE",
        "LOAD_TAGS",
        "SET_LOCATION"
      ]
    }
  },
  "required": [
    "CommandType"
  ]
}

然后转到jsonschema2pojo并创建一个POJO,选择"Gson"作为注释样式,因为这似乎是要做的事情。我按下预览键,得到一个不包含枚举值的类;

@Generated("org.jsonschema2pojo")
public class CommandType {
@Expose
private String type;
@SerializedName("enum")
@Expose
private List<String> _enum = new ArrayList<String>();
/**
* 
* @return
* The type
*/
public String getType() {
return type;
}
/**
* 
* @param type
* The type
*/
public void setType(String type) {
this.type = type;
}
/**
* 
* @return
* The _enum
*/
public List<String> getEnum() {
return _enum;
}
/**
* 
* @param _enum
* The enum
*/
public void setEnum(List<String> _enum) {
this._enum = _enum;
}
}

不出所料,如果我继续尝试在Android应用程序中使用这个反序列化一些东西,我会得到一个只有字段默认值的对象。由于在这个阶段存在明显的问题,我没有包括Android方面的细节。

除了缺少枚举值之外,POJO中没有名为"CommandType"的属性。类本身使用了该名称,原始名称在模式生成中丢失。

如果我对json schemvalidator尝试生成的模式,我会得到错误

  Found 1 error(s)
  Message: Required properties are missing from object: CommandType.
  Schema path: #/required

所以它似乎我使用Json。网络错误。然而,我的用法似乎很简单;我想要枚举字符串而不是int,以使最终的协议随着事情的变化而变得健壮,我想要一个类型指示,这样我就可以在Android端反序列化到正确的POJO,因为我将有几个不同的类用于多类型查询/响应协议。我这样做有什么明显的错误吗?

在http://www.jsonschema2pojo.org/选择JSON Schema而不是JSON作为源类型

结果:

@Generated("org.jsonschema2pojo")
public static enum CommandType {
UNKNOWN("UNKNOWN"),
PING("PING"),
GET_TIMINGS("GET_TIMINGS"),
GET_EVENT_ID("GET_EVENT_ID"),
NEW_EVENT("NEW_EVENT"),
LOAD_PEOPLE("LOAD_PEOPLE"),
LOAD_TAGS("LOAD_TAGS"),
SET_LOCATION("SET_LOCATION");
private final String value;
...etc

相关内容

  • 没有找到相关文章

最新更新