无法在Json字符串中反序列化非Ascii

时间:2020-11-09 19:17:49

标签: c# json serialization

每次我尝试反序列化包含非ASCII字符的字符串(使用.netcore3.1的JsonSerializer)时,我都无法获得正确的结果。例如,当这是字符串

private String readMessage()
{
    Uri mSmsinboxQueryUri = Uri.parse("content://sms/inbox");
    String[] projection = {"address", "body"};        
    String phoneNumber = getPhoneNo();       
    String result = null;
    String[] data = null;
    try {
        Cursor cursor1 = getContentResolver().query(mSmsinboxQueryUri,
                projection,
                "address = ?",
                new String[]{phoneNumber},
                "date DESC LIMIT 1");

         while (result==null)
         {
          if (cursor1 != null && cursor1.moveToNext())
          {
            result = cursor1.getString(cursor1.getColumnIndex("body"));
            data = result.split("/");
            
            if (data.length==6)
                break;
            else
                result = null;
          }
         }
    }
    catch (Exception e){
    }

    return result;
}

我需要进行哪些更改才能使用JsonDeserializer进行反序列化?

我查看了{ "id": "0", "jsonrpc": "2.0", "result": { "languages": ["German","English","Spanish","French","Italian","Dutch","Portuguese","Russian","Japanese","Chinese (simplified)","Esperanto","Lojban"], "languages_local": ["Deutsch","English","Espa├▒ol","Fran├ºais","Italiano","Nederlands","Portugu├¬s","╤Ç╤â╤ü╤ü╨║╨╕╨╣ ╤Å╨╖╤ï╨║","µùѵ£¼Φ¬₧","τ«ÇΣ╜ôΣ╕¡µûç (Σ╕¡σ¢╜)","Esperanto","Lojban"] } } 的{​​{1}}属性,但是在使用它时没有任何作用。

我正在尝试将其反序列化为以下类(LanguagesResponse)

JsonSerializationOptions

其中RpcResponse是Encoder public class LanguagesResponse : RpcResponse { public LanguagesResult result { get; set; } } public class LanguagesResult { public List<string> languages = new List<string>(); public List<string> languages_local = new List<string>(); }

收到回复后,我将进行反序列化:

string id

谢谢

1 个答案:

答案 0 :(得分:0)

请勿将MemoryStream传递给DeserializeAsync。 (这仅在内容为ASCII时才有效,因为这是字符串与字节数组相同的唯一编码。)

改为传递一个字符串,您可以使用它:

string s = Encoding.UTF8.GetString(ms);

也就是说,假设您的内容是UTF-8编码的。您需要找出答案。如果是其他编码,请使用该编码代替Encoding.UTF8

编辑

您实际上不需要找出什么编码并对其进行硬编码(例如Encoding.UTF8)。您可以改用此行,它将从响应中获取编码:

string s = response.ContentEncoding.GetString(ms);

但是,写得不好的API可能不会在响应中包含编码,因此您必须对其进行硬编码才能使其正常工作。