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; }
}

我可以毫无问题地设置Error的值。但是如何为数据设置值我不明白。任何人都可以为这种情况提出适当的解决方案吗?我知道这个问题可以通过Java 中的扩展来解决。我可以在 C# 中使用类似的东西吗?

更新:我想在 JSON 中有共同的根对象 - 数据和错误。但是数据对象可以有不同的上下文,比如:坐标、用户数据等。

4

3 回答 3

2

您可以将 Data 设置为坐标实例。那是这样的:

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 回答