在Android客户端和C#服务器之间传输json数据

时间:2016-08-30 10:42:43

标签: java c# json architecture data-transfer

我在服务器(C#.Net 4.6.1)和客户端(Android App SDK ver。> = 9)之间传递数据

我使用JSON来获取自定义类实例的文本表示,并通过网络发送它们。

有一组,我能够发送的实例。每个类实现接口:

public interface IJsonData
{
    [IgnoreDataMember]
    int MinimalClientVersion { get; }

    [IgnoreDataMember]
    int Constructor { get; }
}

set 的类示例:

[DataContract]
public class JsonDataChatMessage : IJsonData
{
    #region IJsonData implemetation
    //goes here
    #endregion

    [DataMember]
    public string SenderName { get; set; }

    [DataMember]
    public string Text { get; set; }
}

ServerJsonMessage的Creator获取任何实现接口并填充其字段的类的实例:

[DataContract]
public class ServerJsonMessage
{
    [DataMember]
    public int MinimalClientVersion { get; set; }

    [DataMember]
    public int Constructor { get; set; } //Numeric id of Data

    [DataMember]
    public dynamic Data { get; set; } //OVER HERE!

    private ServerJsonMessage()
    {
        //hide constructor
    }

    public static ServerJsonMessage Create(IJsonData jsonData)
    {
            return serverJsonMessage = new ServerJsonMessage
            {
                MinimalClientVersion = jsonData.MinimalClientVersion,
                Constructor = jsonData.Constructor,
                //Option 1
                //Data = JsonConvert.SerializeObject(jsonData)
                //Option 2
                Data = jsonData
            };
    }

    public string ToJson()
    {
        return JsonConvert.SerializeObject(this);
    }
}

问题是:

填写数据字段的最佳选择是什么?它应该是String还是Object还是IJsonData还是其他任何一个?

看起来似乎没有什么可担心的,但在客户端接收此类消息的方法如下:

  1. 接收并解析ServerJsonMessage的JSON表示

  2. 稍后检查getConstructor()的值以找出ServerJsonMessage.Data的类并解析它。

  3. ServerJsonMessage serverJsonMessage = ServerJsonMessage.parse(textFromServer);
    if(serverJsonMessage.getConstructor() == 1234){
        JsonDataChatMessage jsonDataChatMessage 
            = JsonDataChatMessage.parse(serverJsonMessage.getData())
                    //work
    }
    

    客户端的ServerJsonMessage类如下所示:

    public class ServerJsonMessage {
        private int MinimalClientVersion;
        private int Constructor;
        //option1
        //private String Data; 
        //option2
        private Object Data;
    
        public static ServerJsonMessage parse(String json)
            throws Exception {
            ServerJsonMessage serverJsonMessage = new Gson().fromJson(json, ServerJsonMessage.class);
            return serverJsonMessage;
        }
    }
    

    如果我使用选项1:

    解析JsonDataChatMessage看起来不错:

    JsonDataChatMessage msg = JsonDataChatMessage.parse(serverJsonMessage.getData());
    

    但JSON的数据字段本身看起来很难看:

    {
    "MinimalClientVersion": 0,
    "Constructor": 1234,
    "Data": "[{\"Id\":\"f3c1d07d-b1b1-4d09-a91e-17b7b348b06c\",\"IdUser\":null,\"Route\":[{\"CName\":null,\"Code\":2,\"Name\":null,\"Type\":\"fdf\",\"SName\":\"hhh\",\"Other\":null,\"Increase\":0.0,\"GeoPoint\":null},{\"CName\":null,\"Code\":14, ... }]"
    }
    

    这种方法的另一个缺点是我无法提前定义内部是否有数组或单个对象"数据"

    如果我使用选项2:

    解析JsonDataChatMessage需要首先将数据转换为字符串,这会导致不必要的性能损失

    String string = new Gson().toJson(serverJsonMessage.getData())
    JsonDataChatMessage msg = JsonDataChatMessage.parse(string);
    

    ,因为

    //this line throws exception
    JsonDataChatMessage jsonDataChatMessage = (JsonDataChatMessage)serverJsonMessage.getData(); 
    

    发送数据的最佳方式是什么?我应该选择哪个选项,或者如何更改系统的架构?

0 个答案:

没有答案