0

iPadアプリと通信するためにac#rest Webサービスを開発しましたが、これまでのところ問題なく使用しています。これは非常に単純なことで、いくつかのクエリと GET メソッドを使用すると、これまでのところ非常にうまく機能しています。問題は、アプリから Web サービスにデータを送信して、データベースに挿入しようとしていることです。

NSString *query = [NSString stringWithFormat:@"http:mywebsite.com"];
    _theURL = [[NSURL alloc]initWithString:query];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:_theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15.0];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSData *requestData = [NSData dataWithBytes:[json UTF8String] length:[json length]];
    [request setHTTPBody:requestData];
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];

これは基本的に、接続を確立しようとする目的の C コードであり、送信する NSData を投稿およびエンコードするように http メソッドを設定します。この NSData は、すでに準備ができている単なる json 文字列です。

今、私の Web サービスでは、この NSData を Byte[] で取得して、文字列にデコードし、json を取得しようとしています。問題は、私にはそれができないということです。私のWebサービスメソッドコードは次のとおりです。

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public bool submitResults(Byte[] data) {
String jsonString = System.Text.Encoding.UTF8.GetString(data);
try{
  JavaScriptSerializer json = new JavaScriptSerializer();
var resultado = json.Deserialize<Pergunta[]>(jsonString);

...そしてそれは続きます。これをすべて再開します。データを Web サービスに送信できないため、DB に挿入できます。どんな助けでも大歓迎です。

ところで、私が得ているエラーはこの恐ろしいことです:

{"メッセージ":"Type \u0027System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=2.0] .0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089]]\u0027 は、配列の逆シリアル化ではサポートされていません。 serializer, Boolean throwOnError, IList& convertList)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertObject)\r\n at System.Web.Script .Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type 型, JavaScriptSerializer シリアライザー,System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n で System.Web.Script.Serialization.JavaScriptSerializer. Deserialize[T](String input)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

だから、私を助けるためにあなたを助けようとしている、ここに私のjsonがあります: =)

[
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "1",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "2",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "3",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "21",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 2,
    "cursoID" : "601",
    "perguntaID" : "4",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 2,
    "cursoID" : "601",
    "perguntaID" : "5",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 3,
    "cursoID" : "601",
    "perguntaID" : "6",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 3,
    "cursoID" : "601",
    "perguntaID" : "7",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 3,
    "cursoID" : "601",
    "perguntaID" : "8",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "9",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "10",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "11",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "12",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "13",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 5,
    "cursoID" : "601",
    "perguntaID" : "14",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 5,
    "cursoID" : "601",
    "perguntaID" : "15",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 5,
    "cursoID" : "601",
    "perguntaID" : "16",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "17",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "18",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "19",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "20",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 7,
    "cursoID" : "601",
    "perguntaID" : 22,
    "respostaTexto" : "Adorei!",
    "nb" : 19574
  }
]

アップデート:

多くの調査の結果、Xcode でのシリアル化に関係していると思います。こんなふうになります:

_arrayPerguntas = [[NSMutableArray alloc]init];
    for (int i = 0; i < _conteudoProgramatico.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:1]];
        [resp setPerguntaID:[_idConteudoProgramatico objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasConteudoProgramatico objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _sessoesPraticas.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:2]];
        [resp setPerguntaID:[_idSessoesPraticas objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasSessoesPraticas objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _materiaisSuporte.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:3]];
        [resp setPerguntaID:[_idMateriaisSuporte objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasMateriaisSuporte objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _apresentacao.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:4]];
        [resp setPerguntaID:[_idApresentacao objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasApresentacao objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _expectativas.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:5]];
        [resp setPerguntaID:[_idExpectativas objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasExpectativas objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _feedBack.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:6]];
        [resp setPerguntaID:[_idFeedback objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasFeedback objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    InqueritosResposta *resp = [[InqueritosResposta alloc]init];
    [resp setNb:[NSNumber numberWithInt:_nb]];
    [resp setCursoID:[self indiceSessao:_nomeSessao]];
    [resp setCategoriaID:[NSNumber numberWithInt:7]];
    [resp setPerguntaID:[NSNumber numberWithInt:22]];
    [resp setRespostaTexto:_respostaObservacoes];
    [_arrayPerguntas addObject:resp];

    NSError *writeError = nil;
    NSMutableArray *jsonRespostas = [[NSMutableArray alloc]init];
    for(InqueritosResposta *resp in _arrayPerguntas)
    {
        NSMutableDictionary *jAnswer = [[NSMutableDictionary alloc] init];
        [jAnswer setObject:resp.nb forKey:@"nb"];
        [jAnswer setObject:resp.cursoID forKey:@"cursoID"];
        [jAnswer setObject:resp.categoriaID forKey:@"categoriaID"];
        [jAnswer setObject:resp.perguntaID forKey:@"perguntaID"];
        if (resp.respostaTipo != nil) {
            [jAnswer setObject:resp.respostaTipo forKey:@"respostaTipo"];
        }
        if (resp.respostaTexto != nil) {
            [jAnswer setObject:resp.respostaTexto forKey:@"respostaTexto"];
        }
        [jsonRespostas addObject: jAnswer];
    }
    NSArray *final = [NSArray arrayWithArray:jsonRespostas];
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:final options:NSJSONWritingPrettyPrinted error:&writeError];

    [self submitData:jsonData];

基本的に、さまざまなソースからすべてのオブジェクトを _arrayPerguntas に配置しました。次に、辞書を使用して、それらすべてを別の配列 (最終配列) に正しく配置します。submitData メソッドは、上記の接続設定で入力したものです。前もって感謝します、

ハッピーコーディング、

ルイテックス23

4

2 に答える 2

0

逆シリアル化に失敗していると思います。json オブジェクト (jsonString) を検証してください。非常に優れたオンライン json バリデーターは jsonlint.com です。

于 2012-12-18T17:11:09.520 に答える
0

これをしないでください。マイクロソフトのテクノロジを使用して接続している場合にのみメリットがある Web サービスに対するマイクロソフトの複雑なアプローチを使用しないでください。それでも…せいぜい不安定です。

JSONResult MVC コントローラー メソッドを調べます。これらは、アプリケーションの動作に対して最もプラットフォームに依存しない制御を提供し、発生しているようなあいまいなエラーは発生しません。どちらの方法でも純粋な JSON であり、当て推量はありません。

于 2012-12-17T19:20:52.247 に答える