从json数组中读取数据

时间:2016-11-19 00:26:14

标签: c# json javascriptserializer

我的json格式就像 -

 JavaScriptSerializer ser = new JavaScriptSerializer();
            nameList myNames = ser.Deserialize<nameList>(json);

我想在不使用json.net的情况下阅读翻译的文本值。 但它总是返回空值。

/**
 * System configuration for Angular samples
 * Adjust as necessary for your application needs.
 */
(function (global) {
  System.config({
    paths: {
      // paths serve as alias
      'npm:': 'node_modules/'
    },
    // map tells the System loader where to look for things
    map: {
      // our app is within the app folder
      app: 'app',

      // angular bundles
      '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
      '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
      '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
      '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
      '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
      '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
      '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
      '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
      '@angular/upgrade': 'npm:@angular/upgrade/bundles/upgrade.umd.js',

      // other libraries
      'rxjs':                      'npm:rxjs',
      'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js',
      'ag-grid-ng2': 'node_modules/ag-grid-ng2',
      'ag-grid': 'node_modules/ag-grid',
      'ag-grid-enterprise': 'node_modules/ag-grid-enterprise',
      '@angular/material': 'npm:@angular/material/material.umd.js',
      'angular2-cool-storage': 'npm:angular2-cool-storage',
      'underscore': 'npm:underscore',
      'moment': 'npm:moment',
      'ng2-bootstrap': 'npm:ng2-bootstrap',
      '@ng-idle/core': 'npm:@ng-idle/core/bundles/core.umd.js',
      '@ng-idle/keepalive': 'npm:@ng-idle/keepalive/bundles/keepalive.umd.js',
    },
    // packages tells the System loader how to load when no filename and/or no extension
    packages: {
      app: { main: './main.js', defaultExtension: 'js' },
      rxjs: { defaultExtension: 'js' },
      'angular-in-memory-web-api': { main: './index.js', defaultExtension: 'js' },
      lib: { format: 'register', defaultExtension: 'js' },
      'ag-grid-ng2': { defaultExtension: "js" },
      'ag-grid': { defaultExtension: "js" },
      'angular2-cool-storage': { main: './cool-storage.js', defaultExtension: 'js' },
      'underscore': { main: './underscore.js', defaultExtension: 'js' },
      'moment': { main: './moment.js', defaultExtension: 'js' },
      'ng2-bootstrap': { main: './ng2-bootstrap.js', defaultExtension: 'js' },
      //'@ng-idle/core': { main: './idle.js', defaultExtension: 'js' },
      //'@ng-idle/keepalive': { main: './keepalive.js', defaultExtension: 'js' },
      map: {
          'ag-grid-ng2': 'node_modules/ag-grid-ng2',
          'ag-grid': 'node_modules/ag-grid'
      }
    }
  });
})(this);

2 个答案:

答案 0 :(得分:1)

  

public class nameList {public name [] Translator {get;组; }}

这是将Json映射到的不正确的类。

尝试使用这些类来反序列化Json,它将完美地运行:

public class Translation
{
    public string translatedText { get; set; }
}

public class Data
{
    public List<Translation> translations { get; set; }
}

public class nameList
{
    public Data data { get; set; }
}

到达translatedText属性的示例:

var text = myNames.data.translations[0].translatedText;

答案 1 :(得分:-1)

基于转换此JSON的nameList类(来自注释)以及提供的示例JSON,返回值为null的原因归结为Deserialize方法而不是能够映射到班级。

根据提供的信息,我重新创建了必要的课程。

class nameList {
    public name[] Translator { get; set; }
}

class name {
    public string TranslatedText { get; set; }
}

然后我尝试使用以下

将提供的JSON解析为这些类
var serializer = new JavaScriptSerializer();
// The json data, in one line
string json = "{\"data\":{\"translations\":[{\"translatedText\": \"مرحبا\"}]}}";

// Convert back into object similar to described
nameList myNames = serializer.Deserialize<nameList>(json);

try {
    // Attempt to access
    Console.WriteLine(myNames.Translator[0]);
}
catch (Exception ex) {
    Console.WriteLine("Fail:" + ex.Message);
}

执行时,以下内容输出到控制台。

Fail: Object reference not set to an instance of an object.

表示返回值为null。

如前所述,这是由于Deserialize方法无法映射到类。 (虽然奇怪的是InvalidOperationException没有触发)所以让我们通过转换nameList的实例来看看可以映射什么JSON。

// Manually created object
nameList myNames = new nameList() {
    Translator = new name[] {
        new name() { TranslatedText = "مرحبا" }
    }
};

// Convert to JSON
string json = serializer.Serialize(myNames);
Console.WriteLine("JSON:\n" + json);

执行时,输出以下内容。

JSON:
{"Translator":[{"TranslatedText":"?????"}]}

除了VSCode调试控制台不支持该语言这一显而易见的事实外,我们还面临着一些非常不同的JSON。

所以我们要解剖一下......

{ "Translator": [
        {
            "TranslatedText": "مرحبا"
        }
    ]
}
  1. 只有2个命名字段,而样本JSON中只有3个。
  2. 2个命名字段与类中的属性匹配,我认为这对于JavaScriptSerializer类是必需的,以便它正确映射值。 (其他库如JSON.net可以解决这个限制。)
  3. 希望这有所帮助。