C# 有时是,有时不是JSON错误:“是”;没有为';类型定义无参数构造函数;System.String'&引用;

C# 有时是,有时不是JSON错误:“是”;没有为';类型定义无参数构造函数;System.String'&引用;,c#,ios,asp.net,.net,json,C#,Ios,Asp.net,.net,Json,这是我的密码: JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary<string, string> responseVals = serializer.Deserialize<Dictionary<string, string>>(response); 它起作用了 当响应为 { "status": 21007 } { "receipt": { "r

这是我的密码:

JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, string> responseVals = serializer.Deserialize<Dictionary<string, string>>(response);
它起作用了

响应

{
  "status": 21007
}
{
  "receipt": {
    "receipt_type": "ProductionSandbox",
    "adam_id": 0,
    "app_item_id": 0,
    "bundle_id": "...",
    "application_version": "1.0",
    "download_id": 0,
    "version_external_identifier": 0,
    "receipt_creation_date": "...",
    "receipt_creation_date_ms": "...",
    "receipt_creation_date_pst": "...",
    "request_date": "...",
    "request_date_ms": "...",
    "request_date_pst": "...",
    "original_purchase_date": "...",
    "original_purchase_date_ms": "...",
    "original_purchase_date_pst": "...",
    "original_application_version": "1.0",
    "in_app": [
      {
        "quantity": "1",
        "product_id": "...",
        "transaction_id": "...",
        "original_transaction_id": "...",
        "purchase_date": "...",
        "purchase_date_ms": "...",
        "purchase_date_pst": "...",
        "original_purchase_date": "...",
        "original_purchase_date_ms": "..",
        "original_purchase_date_pst": "...",
        "is_trial_period": "false"
      }
    ]
  },
  "status": 0,
  "environment": "Sandbox"
}
我得到一个错误:

没有为“System.String”类型定义无参数构造函数

为什么不同

这是在web服务(Asp.net)中验证iOS应用程序内购买(在沙箱中)。也许这很重要。

为什么不同

第一个示例之所以有效,是因为您正在传递基本数据 反序列化为
字典
,但在第二个示例中,您尝试转换自定义 对象,即
收据
到不可接受的字符串


如果要反序列化特定属性,则可以将此json字符串转换为
JObject
,然后使用该属性获取值

    string json = @"{
      status: '20122',
      OS: [
        'Windows',
        'macintosh'
      ]
    }";

    JObject obj = JObject.Parse(json);
    Console.WriteLine(obj["status"]);  //20122

第二个响应将不会反序列化到字典中,您可以尝试将其序列化为object

object objClass = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(response);
objectobjclass=Newtonsoft.Json.JsonConvert.DeserializeObject(响应);
或者创建自己的对象并对其进行反序列化


您可以使用,它将根据您的json结构生成类。

json解码器的一个主要优点是,它们通常忽略json中存在的任何字段,但不忽略反序列化类中的字段

如果您只想查看状态,而忽略所有其他内容,则可以执行以下操作:

public  class Data
{
    public string Status {get;set;}
}

public void A()
{
    Data data = Newtonsoft.Json.JsonConvert.DeserializeObject<Response>(response);
}
公共类数据
{
公共字符串状态{get;set;}
}
公共图书馆A()
{
Data Data=Newtonsoft.Json.JsonConvert.DeserializeObject(响应);
}

第二个响应看起来不像是反序列化到字典中。它不能将整个对象放入字符串中吗?@Neil我知道。但是如果我不需要完全反序列化它呢。我只需要另一个值。编写自己的
jsonvert
类来处理它。或者不反序列化json,手动解释字符串。或者编写json类来处理实际数据(非常简单,内置于VS2019编辑/粘贴特殊/粘贴为json类)。@ispiro,根据您的最后一条评论,要从完整的json字符串中获取特定值,您可以将其转换为
JObject
,然后访问该值