0

C#アプリケーションのアーキテクチャに問題があります。次のJSONが必要です。

{data:{lat:22,lng:33}, error:{code:0,description:""}}

私はこれらのクラスでこのJSON構造を実装しようとしています:

public class Response
{
    public object Data { get; set; }
    public object Error { get; set; }

    public Response()
    {
        Error = new ErrorsManager();
    }
}

public class Coordinates : Response
{
    public double Lat { get; set; }
    public double Lng { get; set; }
}

エラーの値は問題なく設定できます。しかし、データの値を設定する方法がわかりません。誰かがこの状況の適切な解決策を提案できますか?この問題はJavaのextendsで解決できることを私は知っています。C#で同様のものを使用できますか?

更新: JSONに共通のルートオブジェクト(データとエラー)を入れたいのですが。ただし、データオブジェクトは、座標、ユーザーデータなど、さまざまなコンテキストを持つことができます。

4

3 に答える 3

2

データを座標のインスタンスに設定します。それはこのようなものです:

public class Response
{
    public object Data { get; set; }
    public object Error { get; set; }

    public Response()
    {
        Error = new ErrorsManager();
        Data = new Coordinates();
    }
}

public class Coordinates {
    public double Lat { get; set; }
    public double Lng { get; set; }
}

次のような意味を持つ、強く型付けされたバージョンのResponseを作成することを考えるかもしれません。

public class Response
{
    public Coordinates Data { get; set; }
    public ErrorsManager Error { get; set; }

    public Response()
    {
        Error = new ErrorsManager();
        Data = new Coordinates();
    }
}

異なる応答タイプがある場合は、Errorのみを定義する基本クラスと、新しいプロパティを追加するサブクラスが必要になる場合があります。JSON.NETのようなものを使用してシリアル化/逆シリアル化していると思います。

あなたはジェネリックである可能性があります:

public class Response<T> where T : new() {
    public T Data { get; set; }
    public ErrorsManager Error { get; set; }

    public Response() {
        Error = new ErrorsManager();
        Data = new T();
    }
}

public class Coordinates {
    /* left away */
}

使用法:

var response = new Response<Coordinates>();
response.Data.Lat = 0.01;
// whatever you like
于 2012-12-01T21:11:41.557 に答える
1

c#:

String JSON = (new JavaScriptSerializer()).Serialize(
    new { data = new { lat = 22; lng = 33; }; error = new {code = 0; description=String.Empty;}; }
);

または:

using System.Web.Script.Serialization;

    public class myResponse
    {
        public Coordinates data;
        public Error error;

        public myResponse()
        {
            data = new Coordinates();
            error = new Error();
        }
    }

    public class Coordinates
    {
        public double lat;
        public double lng;
    }

    public class Error
    {
        public int code;
        public String description;
    }

    var resp = new myResponse();
    resp.data.lat = 0.3453453453;
    resp.data.lng = 0.3453453453;
    resp.error.code = 0;
    resp.error.description = "Description of error";

    String JSON = (new JavaScriptSerializer()).Serialize(resp);
于 2012-12-01T21:10:24.053 に答える
1

オブジェクトとして宣言する代わりに、タイプセーフクラスを作成します

public class Response
{
    public Coordinates Data { get; set; }
    public Error Error { get; set; }
}

public class Error
{
    public int code { get; set; }
    public string description { get; set; }
}

public class Coordinates 
{
    public double Lat { get; set; }
    public double Lng { get; set; }
}

json文字列を次のように逆シリアル化できます

string jsonStr = @"{data:{lat:22,lng:33}, error:{code:0,description:""aaa""}}";

var jObj = JsonConvert.DeserializeObject<Response>(jsonStr); //Json.Net

また

var jObj2 = new JavaScriptSerializer().Deserialize<Response>(jsonStr); 

これらのクラスを宣言せずに、Json.Netを使用して完全に動的な方法を実行することもできます

dynamic dynObj = JsonConvert.DeserializeObject(jsonStr); 
Console.WriteLine(dynObj.data.lat);
Console.WriteLine(dynObj.error.description);
于 2012-12-01T21:14:53.450 に答える