javascript

git

python

java

github

django

c#

reactjs

loops

git-remote

terminology

list

local-storage

pandas

performance

system.out

git-reset

regex

email

string-parsing

Javascript查找json值

我需要在国家/地区的json列表中进行搜索。 json就像:

[ 
{"name": "Afghanistan", "code": "AF"}, 
{"name": "Åland Islands", "code": "AX"}, 
{"name": "Albania", "code": "AL"}, 
{"name": "Algeria", "code": "DZ"}
]

我仅从数据库中获取代码,并会输出整个名称。 因此,如果我得到“ AL”,我想从json“ Albania”中检索

trans by 2020-08-12T06:11:59Z

有什么办法可以在PHP中将json转换为xml?

有什么办法可以在PHP中将json转换为xml? 我知道xml到json的可能性很大。

trans by 2020-08-12T04:00:42Z

在J中的Jackson JSON反序列化过程中,忽略缺少的属性

在这个例子中

class Person {
   String name;
   int age;
}

如果JSON对象缺少属性“ age”,

{
  name : John
}

Person person = objectMapper.readValue(jsonFileReader, Person.class);

它抛出JsonMappingException说它不能反序列化。 在反序列化期间是否有注释可以忽略丢失的字段?

谢谢

trans by 2020-08-11T20:17:56Z

sql-Postgresql左联接json_agg()忽略/删除NULL

SELECT C.id, C.name, json_agg(E) AS emails FROM contacts C
LEFT JOIN emails E ON C.id = E.user_id
GROUP BY C.id;

例如Postgres 9.3创建输出

  id  |  name  |  emails
-----------------------------------------------------------
   1  |  Ryan  |  [{"id":3,"user_id":1,"email":"hello@world.com"},{"id":4,"user_id":1,"email":"again@awesome.com"}]
   2  |  Nick  |  [null]

由于我使用的是LEFT JOIN,因此有些情况下没有右表匹配项,因此用空(空)值代替右表列。 结果,我得到[null]作为JSON聚合之一。

当右表列为空时,如何忽略/删除null,以便有一个空的JSON数组[]

干杯!

trans by 2020-08-11T16:01:53Z

CodeGo.net>如何使用实体框架生成和自动增加Id

修改了整个帖子。

我正在尝试通过Fiddler发布以下JSON POST请求:

{Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}

但是我收到此错误:

Message "Cannot insert the value NULL into column 'Id', table 'xxx_f8dc97e46f8b49c2b825439607e89b59.dbo.User'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated." string

虽然如果我随请求手动发送一个随机ID,那么一切都很好。 像这样:

{Id:"1", Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}

为什么实体框架不生成ID并自动递增ID? 我的POCO课程如下:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Password { get; set; }
    public string Headline { get; set; }
    public virtual ICollection<Connection> Connections { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<Phonenumber> Phonenumbers { get; set; }
    public virtual ICollection<Email> Emails { get; set; }
    public virtual ICollection<Position> Positions { get; set; }
}

public class Connection
{
    public string ConnectionId { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

public class Phonenumber
{
    public string Id { get; set; }
    public string Number { get; set; }
    public int Cycle { get; set; }
    public int UserId { get; set; }
    public User User { get; set; }
}

这是控制器方法。 在调试模式下,我通过Fiddler发送请求时,它在db.SaveChanges();处中断,并给出了上面所看到的错误。

    // POST api/xxx/create
    [ActionName("create")]
    public HttpResponseMessage PostUser(User user)
    {
        if (ModelState.IsValid)
        {
            db.Users.Add(user);
            db.SaveChanges();

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, user);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = user.Id }));
            return response;
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
    }

怎么了?

将字符串ID改为int并删除数据注释。 仍遵循约定将ID重命名为UserId,并在必要时在其他POCO中进行了更改以与更改匹配。

trans by 2020-08-10T17:12:51Z

ajax-如何在.getJSON jQuery中设置编码

在我的Web应用程序中,我使用jQuery的$.getJSON方法提交了一些表单字段。 我在编码方面遇到了一些问题。 我的应用程序的字符集是charset=ISO-8859-1,但我认为这些字段是通过UTF-8提交的。

如何设置$.getJSON通话中使用的编码?

trans by 2020-08-10T12:08:12Z

CodeGo.net>如何对返回JsonResult的Action方法进行单元测试?

如果我有这样的控制器:

[HttpPost]
public JsonResult FindStuff(string query) 
{
   var results = _repo.GetStuff(query);
   var jsonResult = results.Select(x => new
   {
      id = x.Id,
      name = x.Foo,
      type = x.Bar
   }).ToList();

   return Json(jsonResult);
}

基本上,我从存储库中获取东西,然后将其投影到匿名类型的actionResult.Data中。

如何进行单元测试?

actionResult.Data具有一个名为List<T>的属性,但与我们预期的一样,其类型为object

这是否意味着如果我要测试JSON对象是否具有我期望的属性(“ id”,“ name”,“ type”),就必须使用反射?

编辑:

这是我的测试:

// Arrange.
const string autoCompleteQuery = "soho";

// Act.
var actionResult = _controller.FindLocations(autoCompleteQuery);

// Assert.
Assert.IsNotNull(actionResult, "No ActionResult returned from action method.");
dynamic jsonCollection = actionResult.Data;
foreach (dynamic json in jsonCollection)
{
   Assert.IsNotNull(json.id, 
       "JSON record does not contain \"id\" required property.");
   Assert.IsNotNull(json.name, 
       "JSON record does not contain \"name\" required property.");
   Assert.IsNotNull(json.type, 
       "JSON record does not contain \"type\" required property.");
}

但是我在循环中收到一个运行时错误,指出“对象不包含id的定义”。

当我断点时,actionResult.Data被定义为匿名类型的List<T>,因此我确定是否通过这些枚举可以检查属性。 在循环内部,该对象确实具有一个称为“ id”的属性-因此无法确定问题所在。

trans by 2020-08-10T06:13:56Z

json-将对象传递给节点+ express +玉中的客户端?

我在服务器上有一个非常重量级的查询,可以生成新的页面渲染,并且我希望将查询的一些结果传递给客户端(作为对象的javascript数组)。 基本上是这样,因此我不必稍后再进行单独的JSON查询即可获得相同的内容(通常是静态的)。 数据最终将是有用的,但最初没有用,因此我没有将其直接放入文档中。

app.get('/expensiveCall', function(req, res) {
    // do expensive call
    var data = veryExpensiveFunction();
    res.render('expensiveCall.jade', {
        locals: {
                data: data,
                }
        });
    });
});

数据是一个对象数组,最初只使用一些对象。 我想传递整个数据或传递一些子集(取决于情况)。 我的玉看起来像普通的玉,但我想加入一些类似的东西

<script type="text/javascript">
var data = #{data};
</script>

但这不起作用(它是一个对象数组)。

trans by 2020-08-09T18:56:57Z

asp.net-Newtonsoft.Json序列化返回空的json obj

我有以下类别的对象的列表:

public class Catagory
{
    int catagoryId;
    string catagoryNameHindi;
    string catagoryNameEnglish;
    List<Object> subCatagories;
    public Catagory(int Id, string NameHindi, string NameEng,List<Object> l)
    {
        this.catagoryId = Id;
        this.catagoryNameHindi = NameHindi;
        this.catagoryNameEnglish = NameEng;
        this.subCatagories = l;
    }
}

  public class SubCatagory
{
    int subCatagoryId { get; set; }
    string subCatNameHindi { get; set; }
    string subCatNameEng { get; set; }

    public SubCatagory(int Id, string NameHindi, string NameEng)
    {
        this.subCatagoryId = Id;
        this.subCatNameEng = NameEng;
        this.subCatNameHindi = NameHindi;
    }
}

当我使用Newtonsoft.Json将此列表转换为json字符串时,它返回空对象的数组。

  string json=JsonConvert.SerializeObject(list);

我得到以下结果。

[{},{},{},{},{}]

关于这个问题,请帮助我。

trans by 2020-08-09T13:40:59Z

python-将多个JSON记录读取到Pandas数据框中

我想知道是否存在一种将多记录JSON文件(每行是一个JSON dict)读入熊猫数据帧的内存有效方式。 下面是带有工作解决方案的2行示例,我可能需要非常多的记录。 示例用途是处理Hadoop Pig JSonStorage函数的输出。

import json
import pandas as pd

test='''{"a":1,"b":2}
{"a":3,"b":4}'''
#df=pd.read_json(test,orient='records') doesn't work, expects []

l=[ json.loads(l) for l in test.splitlines()]
df=pd.DataFrame(l)
trans by 2020-08-09T10:08:16Z

如何在Java 7中使用org.json Java库

我的应用程序中需要一些简单的JSON解析,而Douglas Crockford库似乎正是我所需要的。

但是,我似乎遇到了一个问题。 我收到以下错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/json/JSONObject : Unsupported major.minor version 52.0

我用Google搜索了一下,我觉得这是由于某些版本不兼容所致。 我尝试过更改Java版本,但似乎无济于事。 我在程序中使用了Java 7和Java 7功能,最终我想使用Java 7。

我该如何解决这个问题?

PS:我看了杰克逊和GSON,绝对不想使用任何一个,所以请不要提出其他建议。

trans by 2020-08-09T09:09:19Z

Ruby on Rails-在数据库中存储数组:JSON与序列化数组

我想存储3个元素的数组:帖子的最后3条评论。 我知道我可以将Comment表加入Post 1,但是我会避免出于扩展目的而进行大量的请求。

所以我想知道什么是存储这三个元素的最佳方法,因为我想在每次发表新评论时都轻松地对其进行更新:删除最后一条评论并添加新评论。

正确的方法是什么? 将其存储在序列化数组还是JSON对象中?

trans by 2020-08-09T03:37:44Z

javascript-使用Node解析XLSX并创建json

好的,所以我发现这个非常好的文献记录为node_module,称为js-xlsx

问题:如何解析xlsx以输出json?

这是excel工作表的样子:

enter image description here

最后,json应该看起来像这样:

[
   {
   "id": 1,
   "Headline": "Team: Sally Pearson",
   "Location": "Austrailia",
   "BodyText": "...",
   "Media: "..."
   },
   {
   "id": 2,
   "Headline": "Team: Rebeca Andrade",
   "Location": "Brazil",
   "BodyText": "...",
   "Media: "..."
   }
]

index.js:

if(typeof require !== 'undefined') {
    console.log('hey');
    XLSX = require('xlsx');
}
var workbook = XLSX.readFile('./assets/visa.xlsx');
var sheet_name_list = workbook.SheetNames;
sheet_name_list.forEach(function(y) { /* iterate through sheets */
  var worksheet = workbook.Sheets[y];
  for (z in worksheet) {
    /* all keys that do not begin with "!" correspond to cell addresses */
    if(z[0] === '!') continue;
    // console.log(y + "!" + z + "=" + JSON.stringify(worksheet[z].v));

  }

});
XLSX.writeFile(workbook, 'out.xlsx');
trans by 2020-08-08T18:33:37Z

java-Gson序列化多态对象列表

我正在尝试使用Gson将涉及多态的对象序列化/反序列化为JSON。

这是我的序列化代码:

ObixBaseObj lobbyObj = new ObixBaseObj();
lobbyObj.setIs("obix:Lobby");

ObixOp batchOp = new ObixOp();
batchOp.setName("batch");
batchOp.setIn("obix:BatchIn");
batchOp.setOut("obix:BatchOut");

lobbyObj.addChild(batchOp);

Gson gson = new Gson();
System.out.println(gson.toJson(lobbyObj));

结果如下:

 {"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch"}]}

除了缺少继承成员的内容(特别是缺少ObixBaseObjobixBatchout字符串)外,序列化大部分都有效。这是我的基类:

public class ObixBaseObj  {
    protected String obix;
    private String display;
    private String displayName;
    private ArrayList<ObixBaseObj> children;

    public ObixBaseObj()
    {
        obix = "obj";
    }

    public void setName(String name) {
        this.name = name;
    }
        ...
}

这是我的继承类(ObixOp)的样子:

public class ObixOp extends ObixBaseObj {
    private String in;
    private String out;

    public ObixOp() {
        obix = "op";
    }
    public ObixOp(String in, String out) {
        obix = "op";
        this.in = in;
        this.out = out;
    }
    public String getIn() {
        return in;
    }
    public void setIn(String in) {
        this.in = in;
    }
    public String getOut() {
        return out;
    }
    public void setOut(String out) {
        this.out = out;
    }
}

我意识到我可以为此使用适配器,但是问题是我正在序列化基类类型为ObixBaseObj的集合。大约有25个继承自此的类。 我该如何优雅地进行这项工作?

trans by 2020-08-08T17:14:02Z

java-多态反序列化仍然需要Jackson的@JsonSubTypes吗?

我可以序列化和反序列化类层次结构,其中抽象基类用

@JsonTypeInfo(
    use = JsonTypeInfo.Id.MINIMAL_CLASS,
    include = JsonTypeInfo.As.PROPERTY,
    property = "@class")

但是没有列出子类的@JsonSubTypes,并且子类本身是相对未注释的,构造函数上只有equals()。 ObjectMapper是香草的,我没有使用mixin。

Jackson关于PolymorphicDeserialization和“类型ID”的文档建议(强烈)我需要在抽象基类上使用equals()批注,或者在mixin上使用它,或者需要在ObjectMapper中注册子类型。 并且有很多这样的问题和/或博客帖子都可以达成共识。 但这有效。 (这是杰克逊2.6.0。)

那么...我是尚未记录的功能的受益者,还是我依靠未记录的行为(可能会更改)还是发生了其他事情? (我问是因为我真的不希望它成为后两者之一。但我知道。)

编辑:添加代码-和一个注释。 评论是:我应该提到,我要反序列化的所有子类都与基本抽象类位于同一个程序包和相同的jar中。

抽象基类:

package so;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
    use = JsonTypeInfo.Id.MINIMAL_CLASS,
    include = JsonTypeInfo.As.PROPERTY,
    property = "@class")
public abstract class PolyBase
{
    public PolyBase() { }

    @Override
    public abstract boolean equals(Object obj);
}

它的一个子类:

package so;
import org.apache.commons.lang3.builder.EqualsBuilder;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public final class SubA extends PolyBase
{
    private final int a;

    @JsonCreator
    public SubA(@JsonProperty("a") int a) { this.a = a; }

    public int getA() { return a; }

    @Override
    public boolean equals(Object obj) {
        if (null == obj) return false;
        if (this == obj) return true;
        if (this.getClass() != obj.getClass()) return false;

        SubA rhs = (SubA) obj;
        return new EqualsBuilder().append(this.a, rhs.a).isEquals();
    }
}

子类equals()actual1相同,除了在SubBboolean(不是int)中将字段a声明为String(不是int)(并且方法getA进行了相应修改)。

测试类别:

package so;    
import java.io.IOException;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.testng.annotations.Test;
import static org.assertj.core.api.Assertions.*;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestPoly
{
    public static class TestClass
    {
        public PolyBase pb1, pb2, pb3;

        @JsonCreator
        public TestClass(@JsonProperty("pb1") PolyBase pb1,
                         @JsonProperty("pb2") PolyBase pb2,
                         @JsonProperty("pb3") PolyBase pb3)
        {
            this.pb1 = pb1;
            this.pb2 = pb2;
            this.pb3 = pb3;
        }

        @Override
        public boolean equals(Object obj) {
            if (null == obj) return false;
            if (this == obj) return true;
            if (this.getClass() != obj.getClass()) return false;

            TestClass rhs = (TestClass) obj;
            return new EqualsBuilder().append(pb1, rhs.pb1)
                                      .append(pb2, rhs.pb2)
                                      .append(pb3, rhs.pb3)
                                      .isEquals();
        }
    }

    @Test
    public void jackson_should_or_should_not_deserialize_without_JsonSubTypes() {

        // Arrange
        PolyBase pb1 = new SubA(5), pb2 = new SubB("foobar"), pb3 = new SubC(true);
        TestClass sut = new TestClass(pb1, pb2, pb3);

        ObjectMapper mapper = new ObjectMapper();

        // Act
        String actual1 = null;
        TestClass actual2 = null;

        try {
            actual1 = mapper.writeValueAsString(sut);
        } catch (IOException e) {
            fail("didn't serialize", e);
        }

        try {
            actual2 = mapper.readValue(actual1, TestClass.class);
        } catch (IOException e) {
            fail("didn't deserialize", e);
        }

        // Assert
        assertThat(actual2).isEqualTo(sut);
    }
}

该测试通过,如果您在第二条equals()行处断裂,则可以检查actual1,然后查看:

{"pb1":{"@class":".SubA","a":5},
 "pb2":{"@class":".SubB","a":"foobar"},
 "pb3":{"@class":".SubC","a":true}}

因此,对三个子类进行了正确的序列化(每个子类以其类名作为id),然后反序列化,然后将结果进行比较以得出相等的结果(每个子类具有“值类型” equals())。

trans by 2020-08-06T22:26:50Z

php-如何确定字符串是否为有效JSON?

有谁知道一个健壮的(和防弹的)PHP is_JSON函数代码片段? 我(显然)遇到一种情况,我需要知道字符串是否为JSON。

嗯,也许通过JSONLint请求/响应来运行它,但这似乎有点过头了。

trans by 2020-08-06T20:39:37Z

java-Jackson-具有双向关系的实体的序列化(避免循环)

我有两个实体:

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

我知道Childparent。如果我要序列化children的实例,它们很好。

但是我还需要传输Child的实例,并且我想填充parent字段。

换一种说法:

  1. 在对Child进行序列化时,应该具有parent,但其父字段可能为空(可以使用json参考注释解决)。
  2. 在对Child进行序列化时,应具有parent及其children(但children不必填充parent)。

有没有一种使用标准Jackson功能来解决它的方法?

即 跳过已经序列化的实体的序列化,而不是标记符合或不符合序列化条件的字段。

trans by 2020-08-06T19:28:57Z

json-如何要求一个字段或另一个字段(或其他两个字段),但不是全部?

我在想出可以验证JSON是否包含以下内容的JSON模式时遇到了麻烦:

  • 仅一个字段
  • 仅另一个领域
  • (其他两个字段之一)

但如果存在多个则不匹配。

具体来说,我要

  • matchesFiles
  • matchesFiles
  • matchesFiles和/或doesntMatchFiles

进行验证,但我不想接受更多的验证。

这是到目前为止我得到的:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "required": [ "unrelatedA" ],
    "properties": {
    "unrelatedA": {
        "type": "string"
    },
    "fileNames": {
        "type": "array"
    },
    "copyAll": {
        "type": "boolean"
    },
    "matchesFiles": {
        "type": "array"
    },
    "doesntMatchFiles": {
        "type": "array"
        }
    },
    "oneOf": [
         {"required": ["copyAll"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["fileNames"]}},
         {"required": ["fileNames"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["copyAll"]}},
         {"anyOf": [
               {"required": ["matchesFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}},
               {"required": ["doesntMatchFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}}]}
    ]
} ;

这比我想要的要匹配。 我希望它符合以下所有条件:

{"copyAll": true, "unrelatedA":"xxx"}
{"fileNames": ["aab", "cab"], "unrelatedA":"xxx"}
{"matchesFiles": ["a*"], "unrelatedA":"xxx"}
{"doesntMatchFiles": ["a*"], "unrelatedA":"xxx"}
{"matchesFiles": ["a*"], "doesntMatchFiles": ["*b"], "unrelatedA":"xxx"}

但不符合:

{"copyAll": true, "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"copyAll": true, "doesntMatchFiles": ["*b"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"unrelatedA":"xxx"}

我猜想我很想念一些东西-我想知道它是什么。

trans by 2020-08-06T16:45:33Z

java-如何获取Spring 4.1使用的Jackson ObjectMapper?

Spring 4.1实例化了Jackson ObjectMapper实例。 我有理由想要将该实例@Autowire放入我的一个控制器中:控制器使用Jackson对其自身进行一些较小的JSON解析,但是它使用的ObjectMapper应该是Spring本身使用的一个实例。 我该如何去实现?

请注意,我并不是在问如何自定义配置Spring使用的ObjectMapper。 我对默认设置感到满意。 我只想获取Spring所使用的实例,以便可以在自己的代码中重用现有实例。

trans by 2020-08-06T12:46:07Z

NET中如何提高JSON反序列化速度? (JSON.net还是其他?)

我们正在考虑用JSON(WCF或其他)调用替换(一些或许多)“经典” SOAP XML WCF调用,因为其开销较低且易于直接在Javascript中使用。 现在,我们刚刚在Web服务中添加了一个额外的Json端点,并在某些操作中添加了WebInvoke属性并对其进行了测试。 使用C#.Net客户端或Javascript客户端,一切正常。 到目前为止,一切都很好。

但是,似乎将大JSON字符串反序列化为C#.Net中的对象比反序列化SOAP XML慢得多。 两者都使用DataContract和DataMember属性(完全相同的DTO)。 我的问题是:这是预期的吗? 我们可以做些什么来优化此性能? 还是我们应该仅针对较小的请求考虑JSON,而我们确实注意到性能有所提高。

到目前为止,我们已经选择了JSON.net进行此测试,即使在此测试用例中未显示它,也应该比.Net JSON序列化要快。 不知何故,ServiceStack反序列化根本不起作用(无错误,为IList返回null)。

为了进行测试,我们进行了服务呼叫以收集房间列表。 它返回一个GetRoomListResponse,并且在返回5个虚拟房间的情况下,JSON如下所示:

{"Acknowledge":1,"Code":0,"Message":null,"ValidateErrors":null,"Exception":null,"RoomList":[{"Description":"DummyRoom","Id":"205305e6-9f7b-4a6a-a1de-c5933a45cac0","Location":{"Code":"123","Description":"Location 123","Id":"4268dd65-100d-47c8-a7fe-ea8bf26a7282","Number":5}},{"Description":"DummyRoom","Id":"aad737f7-0caa-4574-9ca5-f39964d50f41","Location":{"Code":"123","Description":"Location 123","Id":"b0325ff4-c169-4b56-bc89-166d4c6d9eeb","Number":5}},{"Description":"DummyRoom","Id":"c8caef4b-e708-48b3-948f-7a5cdb6979ef","Location":{"Code":"123","Description":"Location 123","Id":"11b3f513-d17a-4a00-aebb-4d92ce3f9ae8","Number":5}},{"Description":"DummyRoom","Id":"71376c49-ec41-4b12-b5b9-afff7da882c8","Location":{"Code":"123","Description":"Location 123","Id":"1a188f13-3be6-4bde-96a0-ef5e0ae4e437","Number":5}},{"Description":"DummyRoom","Id":"b947a594-209e-4195-a2c8-86f20eb883c4","Location":{"Code":"123","Description":"Location 123","Id":"053e9969-d0ed-4623-8a84-d32499b5a8a8","Number":5}}]}

响应和DTO如下所示:

[DataContract(Namespace = "bla")]
public class GetRoomListResponse
{
    [DataMember]
    public IList<Room> RoomList;

    [DataMember]
    public string Exception;

    [DataMember]
    public AcknowledgeType Acknowledge = AcknowledgeType.Success;

    [DataMember]
    public string Message;

    [DataMember]
    public int Code;

    [DataMember]
    public IList<string> ValidateErrors;
}

[DataContract(Name = "Location", Namespace = "bla")]
public class Location
{
    [DataMember]
    public Guid Id { get; set; }

    [DataMember]
    public int Number { get; set; }

    [DataMember]
    public string Code { get; set; }

    [DataMember]
    public string Description { get; set; }
}

[DataContract(Name = "Room", Namespace = "bla")]
public class Room
{
    [DataMember]
    public Guid Id { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public Location Location { get; set; }
}

然后我们的测试代码如下:

    static void Main(string[] args)
    {
        SoapLogin();

        Console.WriteLine();

        SoapGetRoomList();
        SoapGetRoomList();
        SoapGetRoomList();
        SoapGetRoomList();
        SoapGetRoomList();
        SoapGetRoomList();
        SoapGetRoomList();

        Console.WriteLine();

        JsonDotNetGetRoomList();
        JsonDotNetGetRoomList();
        JsonDotNetGetRoomList();
        JsonDotNetGetRoomList();
        JsonDotNetGetRoomList();
        JsonDotNetGetRoomList();
        JsonDotNetGetRoomList();

        Console.ReadLine();
    }

    private static void SoapGetRoomList()
    {
        var request = new TestServiceReference.GetRoomListRequest()
        {
            Token = Token,
        };

        Stopwatch sw = Stopwatch.StartNew();

        using (var client = new TestServiceReference.WARPServiceClient())
        {
            TestServiceReference.GetRoomListResponse response = client.GetRoomList(request);
        }

        sw.Stop();
        Console.WriteLine("SOAP GetRoomList: " + sw.ElapsedMilliseconds);
    }

    private static void JsonDotNetGetRoomList()
    {
        var request = new GetRoomListRequest()
        {
            Token = Token,
        };

        Stopwatch sw = Stopwatch.StartNew();
        long deserializationMillis;

        using (WebClient client = new WebClient())
        {
            client.Headers["Content-type"] = "application/json";
            client.Encoding = Encoding.UTF8;

            string requestData = JsonConvert.SerializeObject(request, JsonSerializerSettings);

            var responseData = client.UploadString(GetRoomListAddress, requestData);

            Stopwatch sw2 = Stopwatch.StartNew();
            var response = JsonConvert.DeserializeObject<GetRoomListResponse>(responseData, JsonSerializerSettings);
            sw2.Stop();
            deserializationMillis = sw2.ElapsedMilliseconds;
        }

        sw.Stop();
        Console.WriteLine("JSON.Net GetRoomList: " + sw.ElapsedMilliseconds + " (deserialization time: " + deserializationMillis + ")");
    }

    private static JsonSerializerSettings JsonSerializerSettings
    {
        get
        {
            var serializerSettings = new JsonSerializerSettings();

            serializerSettings.CheckAdditionalContent = false;
            serializerSettings.ConstructorHandling = ConstructorHandling.Default;
            serializerSettings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
            serializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore;
            serializerSettings.NullValueHandling = NullValueHandling.Ignore;
            serializerSettings.ObjectCreationHandling = ObjectCreationHandling.Replace;
            serializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;
            serializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Error;

            return serializerSettings;
        }
    }

现在,我们以返回50、500和5000个房间的方式运行了该应用程序。 对象不是很复杂。

这些是结果; 时间以毫秒为单位:

50间客房:

SOAP GetRoomList: 37
SOAP GetRoomList: 5
SOAP GetRoomList: 4
SOAP GetRoomList: 4
SOAP GetRoomList: 9
SOAP GetRoomList: 5
SOAP GetRoomList: 5

JSON.Net GetRoomList: 289 (deserialization time: 91)
JSON.Net GetRoomList: 3 (deserialization time: 0)
JSON.Net GetRoomList: 2 (deserialization time: 0)
JSON.Net GetRoomList: 2 (deserialization time: 0)
JSON.Net GetRoomList: 2 (deserialization time: 0)
JSON.Net GetRoomList: 2 (deserialization time: 0)
JSON.Net GetRoomList: 2 (deserialization time: 0)

500间客房:

SOAP GetRoomList: 47
SOAP GetRoomList: 9
SOAP GetRoomList: 8
SOAP GetRoomList: 8
SOAP GetRoomList: 8
SOAP GetRoomList: 8
SOAP GetRoomList: 8

JSON.Net GetRoomList: 301 (deserialization time: 100)
JSON.Net GetRoomList: 12 (deserialization time: 8)
JSON.Net GetRoomList: 12 (deserialization time: 8)
JSON.Net GetRoomList: 12 (deserialization time: 8)
JSON.Net GetRoomList: 11 (deserialization time: 8)
JSON.Net GetRoomList: 11 (deserialization time: 8)
JSON.Net GetRoomList: 15 (deserialization time: 12)

5000间客房:

SOAP GetRoomList: 93
SOAP GetRoomList: 51
SOAP GetRoomList: 58
SOAP GetRoomList: 60
SOAP GetRoomList: 53
SOAP GetRoomList: 53
SOAP GetRoomList: 51

JSON.Net GetRoomList: 405 (deserialization time: 175)
JSON.Net GetRoomList: 107 (deserialization time: 79)
JSON.Net GetRoomList: 108 (deserialization time: 82)
JSON.Net GetRoomList: 112 (deserialization time: 85)
JSON.Net GetRoomList: 105 (deserialization time: 79)
JSON.Net GetRoomList: 111 (deserialization time: 81)
JSON.Net GetRoomList: 110 (deserialization time: 82)

我正在发布模式下运行该应用程序。 客户端和服务器都在同一台计算机上。 如您所见,与WCF SOAP使用的XML到对象的映射相比,使用JSON对许多(相同类型的)对象进行反序列化要花费更多的时间。 糟糕的是,反序列化比使用SOAP进行整个Web服务花费的时间更多。

对此有解释吗? XML(或WCF SOAP实现)在这方面是否提供了很大的优势,或者我可以在客户端进行任何更改(我宁愿不更改服务,但可以更改客户端DTO可以接受)以尝试 提高绩效? 感觉好像我已经在JSON.net端选择了一些设置,这些设置应该使其比默认设置更快,不是吗? 这里的瓶颈似乎是什么?

trans by 2020-08-06T09:16:37Z

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页 共49页