【发布时间】:2021-05-11 11:09:46
【问题描述】:
我正在使用 Gson 将 json 转换为 java 对象。这是Gson
{
"assetClassDetails":[{}],
"assetClassRequired":null,
"baseUnitofMeasure":"PMI",
"bomParent":"Yes",
"commodityCodeTaric":"84158200",
"enLanguageKey":"EN",
"enMaterialLongText":"Lenovo Privacy Filter for 14" Notebooks ( L, T and X1 Carbon)"",
"grossWeightInKg":null,
"height":null,
"heightLengthWidthUnit":null,
"length":null,"manufacturerPartNumber":"",
"materialLongDescription":"Lenovo Privacy Filter for 14" Notebooks ( L, T and X1 Carbon)"",
"physicalCategory":"Physical",
"volume":null,
"volumeUnit":null,
"width":null,
"xxLanguageKey":null,
"xxMaterialLongText":null
}
问题在于属性 enMaterialLongText 和 materialLongDescription。在值内部,它们有引号。Gson 无法解析 json。 我的代码是
Gson gson = new Gson();
OperationalInfo outout = gson.fromJson(inputJson, OperationalInfo.class);
OperationalInfo 类是这样的:
public class OperationalInfo {
private String commodityCodeTaric= null; // fETCH FROM db
private String physicalCategory= null;
private String materialType= null; // ZN01 *
private String productHierarchy= null; // Gnp Hierarchy
private String baseUnitofMeasure= null; // From Database
private String height= null; // Manual enetered
private String length= null; // Manual enetered
private String width= null; // Manual enetered
private String heightLengthWidthUnit= null; // Manual enetered
private String volume= null; // Manual enetered
private String volumeUnit= null; // Manual enetered
private String grossWeightInKg= null; // Manual enetered
private String itemCategoryGroup= null;
private String manufacturerPartNumber= null; // is same as spn
private String bomParent= null; // yes/No
private String materialLongDescription= null; // Manual enetered
private String enLanguageKey= null; // EN
private String enMaterialLongText= null; // materialLongDescription
private String xxLanguageKey= null; // EN
private String xxMaterialLongText= null;
private String catalogueGroup = null;
private String pirStatus = null; // Changed, Add , mark for Delete
private List<AssetClassLedger> assetClassDetails = null;
private Boolean assetClassRequired = null;
...
}
我在输入 json 上尝试过 String.replace() 用“\”替换双引号。
更新: 请参考我的以下代码:
Gson gson = new Gson();
String test = "{\"assetClassRequired\":\"\",\"baseUnitofMeasure\":\"PMI\",\"bomParent\":\"Yes\",\"commodityCodeTaric\":\"84158200\",\"enLanguageKey\":\"EN\",\"enMaterialLongText\":\"Lenovo Privacy Filter for 14\\\" Notebooks ( L, T and X1 Carbon)\\\"\",\"grossWeightInKg\":\"\",\"height\":\"\",\"heightLengthWidthUnit\":\"\",\"length\":\"\",\"manufacturerPartNumber\":\"\",\"materialLongDescription\":\"Lenovo Privacy Filter for 14\\\" Notebooks ( L, T and X1 Carbon)\\\"\",\"physicalCategory\":\"Physical\",\"volume\":\"\",\"volumeUnit\":\"\",\"width\":\"\",\"xxLanguageKey\":\"\",\"xxMaterialLongText\":\"\"}";
JsonReader reader1 = new JsonReader(new StringReader(test));
reader1.setLenient(true);
OperationalInfo operationalInfo = gson.fromJson(reader1, OperationalInfo.class);
请注意,我为 enMaterialLongText 和 14 英寸的 materialLongDescription 使用了 3 个反斜杠。但是以编程方式,我如何知道要通过三反斜杠转义哪个引号以及要单反斜杠转义哪个引号?
【问题讨论】:
-
解析失败,因为它是无效的JSON。请让您从中获取 JSON 的一方对其进行正确编码。
-
@Ivar NodeJs 能够用 JSON.parse() 解析这个畸形,java 的问题。
-
No, it doesn't。它是无效的 JSON。 (自己通过a validator 运行它。)
-
@Ivar 同意它不是一个有效的 json,但我必须把它变成有效的 json 然后解析。我的游戏计划是将输入拆分为逗号,用于分隔键值对。但也有逗号内部值。因此,对逗号使用正则表达式,后跟双引号 - (,)[\\s]*([^\"]) 并用字符串文字 COMMA 替换它。现在我需要一个正则表达式照顾嵌套引号。一旦在 java 对象中解析了 json,我就可以将属性更改为具有嵌套引号。
-
问题是,根本无法保证您正确修复了 JSON。您将需要转义反斜杠,但您无法知道哪个是值的一部分,哪个不是。 Here is a simple example。有两个有效的 JSON,都带有转义的反斜杠。第一个可能是您要查找的那个,但第二个 also 仅转义了反斜杠(除了一些换行符之外没有其他更改,这些在 JSON 中被忽略)。它们都同样有效,程序无法判断您要查找的内容。