【问题标题】:Sometimes yes and sometimes not JSON error: "No parameterless constructor defined for type of 'System.String'"有时是,有时不是 JSON 错误:“没有为 'System.String' 类型定义无参数构造函数”
【发布时间】:2020-08-31 07:39:00
【问题描述】:

这是我的代码:

JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, string> responseVals = serializer.Deserialize<Dictionary<string, string>>(response);

response

{
  "status": 21007
}

它有效。

response

{
  "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 应用内购买(在沙盒中)。也许这很重要。

【问题讨论】:

  • 第二个响应看起来不像会反序列化成字典。

标签: c# ios asp.net .net json


【解决方案1】:

为什么不一样?

您的第一个示例正在运行,因为您正在传递原始数据 反序列化为Dictionary&lt;string, string&gt;,但在第二个示例中,您正在尝试转换自定义 对象,即receipt 到不可行的字符串


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

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

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

.Net fiddle

【讨论】:

  • 不能把整个对象放到一个字符串中吗?
  • @Neil 我知道。但是,如果我不需要完全反序列化它怎么办。我只需要其他值之一。
  • 编写你自己的JsonConvert 类,来处理它。或者不要反序列化 json,手动解释字符串。或者编写json类来处理实际数据(很简单,内置在VS2019 Edit/Paste Special/Paste as JSON classes)。
  • @ispiro,根据您的上一条评论,要从完整的 json 字符串中获取特定值,您可以将其转换为 JObject,然后访问该值
【解决方案2】:

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

如果你只想要状态而忽略所有其他的,你可以这样做:

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

public void A()
{
    Data data = Newtonsoft.Json.JsonConvert.DeserializeObject<Response>(response);
}

【讨论】:

    【解决方案3】:

    第二个响应不会反序列化成字典,你可以尝试反序列化成对象。

    object objClass = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(response);
    

    或创建您自己的对象并反序列化为它。

    你可以使用from Json to classes,它会根据你的json结构生成类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2023-01-01
      相关资源
      最近更新 更多