Как я могу сериализовать этот объект JSON? - PullRequest
1 голос
/ 25 февраля 2011

У меня есть веб-сервис, который получает строку JSON в качестве параметра.Я смог успешно отправить это только в том случае, если параметром моего веб-метода является универсальный тип 'object'.

Могу ли я сериализовать этот универсальный объект в строку или пользовательский объект?Нужно ли изменить тип параметра этого метода?Любая помощь будет потрясающей.

Вот веб-метод:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string StoreDataOut(object json)
{
   //serialization magic
}

Это тестовый JSON, который передается этому веб-методу:

{
    "uid":"1234abcd",
    "application":"Application Name",
    "eventName":null,
    "clienttoken":"Test Client",
    "version":"1.0.0",
    "datetime":"1/1/2011 12:00 AM",
    "data":[
       {
           "id":"alpha_123",
            "question":"ronunciations in pre-classical times or in non-Attic dialects. For det",
            "answer":"nunciations "
        },
        {
        "id":"beta_456",
        "question":"official documents such as laws an",
        "answer":"or modif"
        },
        {
            "id":"gamma_789",
            "question":" maintained or modified slightly to fit Greek phonology; thus, ?",
            "answer":"iation of Attic"
        },
        {
            "id":"delta_098",
            "question":"econstructed pronunciation of Attic in the late 5th an",
            "answer":"unciation of "
        },
        {
            "id":"epsilon_076",
            "question":"erent stylistic variants, with the descending tail either going straight down o",
            "answer":"Whole bunch"
        },
        {
            "id":"zeta_054",
            "question":"rough breathing when it begins a word. Another diacritic use",
            "answer":"other dia"
        }
    ]
}

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Вы должны иметь возможность для .Net Framework правильно сериализовать большинство объектов, чтобы ваша подпись веб-метода выглядела так:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string StoreDataOut(MyClass input);

Но я обнаружил, что с некоторыми объектами у него есть проблемы, и поэтому мой запасной метод - вместо этого принять строку (которая будет сериализованным JSON) и десериализовать ее самостоятельно либо с помощью JavaScriptSerializer класс или библиотека сериализации JSON, например Json.Net .

Это пример десериализации объекта с использованием класса JavaScriptSerializer, где я выделяю «фактический» метод с помощью метода-оболочки, который обрабатывает десериализацию для нас:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string StoreDataOut(string input)
{
    var serialiser = new JavaScriptSerializer();
    MyClass deserialisedInput = serialiser.Deserialize<MyClass>(input);
    return (StoreDataOutImpl deserialisedInput);
}

private string StoreDataOutImpl(MyClass input);

Это дает вам возможность управлять сериализацией, используя JavaScriptConverters или используя совершенно другую библиотеку (например, Json.Net).

Для этого потребуется, чтобы у вас был класс MyClass, правильно отформатированный для получения входного JSON. Если вы этого не сделаете, вы можете просто заставить сериализатор вывести словарь, который будет содержать пары ключ-значение, соответствующие свойствам сериализованного объекта JSON:

var deserialisedInput = (Dictionary<string, object>)serialiser.DeserializeObject(input);
2 голосов
/ 25 февраля 2011

Вам нужен следующий класс и используйте его как тип в вашем веб-методе вместо объекта.

class JsonDTO
{

  public JsonDTO()
  {
    data = new List<data>();
  }
  public string uid {get; set;}
  public string application {get;set}
  public string eventName {get; set;}
  public string clienttoken {get;set}
  public string version {get;set;}
  public string @datetime {get; set;}
  public List<data> data {get; set;}



}

public class data
{
    public string id {get; set;}
    public string question {get; set;}
    public string answer {get; set;}
 }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...